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


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"));
}
}

您可以使用DateTimeFormatter:

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

返回"2018-08-02"。上面的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);

这将返回相同的字符串。

除了这一行,您有正确的代码。在输入模式中使用XXX而不是.S

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

根据类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

java.time

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日期和时间API java.time的类解析并打印这种格式作为它们的默认格式,也就是说,不使用任何显式格式化程序。另外,格式化程序是内置的,所以我使用一个来指定我们希望格式化的日期没有时间和UTC的偏移量。不需要编写自己的格式化程序这样容易出错的任务。

你的代码出了什么问题

正如其他人所说,您的格式模式字符串与您试图100%解析的日期-时间字符串不匹配。该格式要求在那几秒钟之后应该有一个点和一些毫秒。相反,字符串有一个偏移+05:30。这会导致异常。相比之下,一个参数OffsetDateTime.parse接受带毫秒和不带毫秒的字符串(因为它们在ISO8601中是可选的((但确实需要偏移量(。

你的代码中还有一个错误:在你格式化的格式模式中使用了大写的YYY。这偶尔会给你错误的年份。小写y表示年份。大写Y表示周-年,仅适用于周数。

顺便说一句,由于你的方法是静态的,你不需要创建一个实例来调用它

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

链接

  • Oracle教程:日期-时间,解释如何使用java.time
  • 维基百科文章:ISO 8601

您可以使用这样的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"));
}
}

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

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()));

最新更新