java 如何将日期“2018-08- 02 T00:00:00+05:30”字符串格式化为“2018-18-02”

nnvyjq4y  于 2023-03-16  发布在  Java
关注(0)|答案(5)|浏览(259)
public class Kf_Date {

    public static String getDateUsingOracleFormat(String date) {
        try {
            DateFormat inputFormat = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ss.S");
            Date date2 = inputFormat.parse(date);
            SimpleDateFormat sdf = new SimpleDateFormat("YYY-MM-dd");
            String outputText = sdf.format(date2);
            return outputText;
        } catch(Exception e) {
            e.printStackTrace();
            return e.toString();
        }
    }

    public static void main(String... args) {
        System.out.println(new Kf_Date().getDateUsingOracleFormat("2018-08-02T00:00:00+05:30"));
    }

}
0pizxfdo

0pizxfdo1#

您可以使用DateTimeFormatter

DateTimeFormatter.ofPattern("yyyy-MM-dd")
   .format(ZonedDateTime.parse("2018-08-02T00:00:00+05:30"))

上面的parse调用理解输入的ISO格式。
这是较新的推荐API。如果您使用的Java版本早于8,您应该用途:

Date input = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")
                 .parse("2018-08-02T00:00:00+05:30");
String output = new SimpleDateFormat("yyyy-MM-dd")
                 .format(input);

这将返回相同的字符串。

a0x5cqrl

a0x5cqrl2#

Java.时间

public static String getDateUsingOracleFormat(String date) {
    OffsetDateTime dateTime = OffsetDateTime.parse(date);
    String outputText = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE);
    return outputText;
}

使用此方法声明,main将打印:
2018-08-02
你的格式(您正在解析的和您正在生成的)符合ISO 8601(链接在底部)。java.time的类,现代的Java日期和时间API,解析和打印这种格式作为它们的默认值,也就是说,没有任何显式的格式化程序。格式化程序也是内置的,所以我使用一个来指定我们希望格式化的日期不包含时间和UTC的偏移量。不需要编写自己的格式化程序这一容易出错的任务。

您的代码中出现了什么错误?

正如其他人所说,您的格式模式字符串与您试图解析的日期-时间字符串100%不匹配。该格式要求在秒之后应该有一个点和几个毫秒。相反,您的字符串有一个偏移量,+05:30。这会导致异常。相比之下,单参数OffsetDateTime.parse接受带毫秒和不带毫秒的字符串(因为它们在ISO 8601中是可选的)(但需要偏移)。
你的代码里还有一个错误在要格式化的格式模式中使用大写的YYY。这有时会给予您错误的年份。小写的y表示纪元年。大写的Y表示星期年,仅对星期编号有用。
顺便说一句,因为你的方法是静态的,所以你不需要创建一个示例来调用它。

System.out.println(Kf_Date.getDateUsingOracleFormat("2018-08-02T00:00:00+05:30"));

链接

egdjgwm8

egdjgwm83#

可以按如下方式使用ISO图案:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTimeUtils {

    public static String format(String inputDate, String inputFormat, String outputFormat) throws ParseException {
        DateFormat fromFormat = new SimpleDateFormat(inputFormat);
        fromFormat.setLenient(false);
        DateFormat toFormat = new SimpleDateFormat(outputFormat);
        toFormat.setLenient(false);
        Date date = fromFormat.parse(inputDate);
        return toFormat.format(date);
    }

    public static void main(String[] args) throws ParseException {
        System.out.println(DateTimeUtils.format("2018-08-02T00:00:00+05:30", "yyyy-MM-dd'T'HH:mm:ssXXX", "yyyy-MM-dd"));
    }

}
mnemlml8

mnemlml84#

您的代码除了这一行之外都是正确的。在输入模式中使用XXX代替**.S**:

DateFormat inputFormat = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ssXXX");

根据Class SimpleDateFormat

*X-时区,ISO 8601时区 (-08;-0080; -08:-00)
*S-毫秒,编号 (978)
提示:

如果你在解析日期字符串时遇到问题,并且不知道你的模式有什么问题,那么就打印当前日期,并将其与输入字符串进行比较,然后你就可以看到差异并修复模式:

DateFormat inputFormat = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ss.S");
System.out.println(inputFormat.format(new Date())); // 2018-08-07T08:28:33.800

inputFormat = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ssXXX");
System.out.println(inputFormat.format(new Date())); // 2018-08-07T08:28:33+03:00
eqoofvh9

eqoofvh95#

您可以使用此方法查找可用时区

System.out.println(TimeZone.getAvailableIDs());

找到你想要的时区后使用下面的代码

DateFormat dateFormat = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ssXXX");
dateFormat.setTimeZone(TimeZone.getTimeZone("America/Argentina/San_Luis"));
System.out.println(dateFormat.format(new Date()));

相关问题