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