“如何转换Java字符串”;EEE MMM dd HH:mm:ss zzz yyyy“;日期类型为Java util.date“;yyyy-MM-dd“;
我的源日期类型是“如何转换Java字符串”;EEE MMM dd HH:mm:ss zzz yyyy“;日期类型为Java util.date“;yyyy-MM-dd“;,java,date,datetime,Java,Date,Datetime,我的源日期类型是EEE MMM dd HH:mm:ss zzz yyyy。例如,Sat Dec 12 00:00:00 KST 2020但我的目标日期类型是Java日期类型,格式为yyy-MM-dd。因此,我提出了将Java字符串类型EEE MMM dd HH:mm:ss zzz yyyy转换为Java util对象的方法 private static Date getDate(String beforeDate) throws Exception{ Simpl
EEE MMM dd HH:mm:ss zzz yyyy
。例如,Sat Dec 12 00:00:00 KST 2020
但我的目标日期类型是Java日期类型,格式为yyy-MM-dd
。因此,我提出了将Java字符串类型EEE MMM dd HH:mm:ss zzz yyyy
转换为Java util对象的方法
private static Date getDate(String beforeDate) throws Exception{
SimpleDateFormat readFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
Date rdate = readFormat.parse(beforeDate);
SimpleDateFormat writeFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
String format = writeFormat.format(rdate);
System.out.println(format);
return writeFormat.parse(format);
}
System.out.println(格式)
line打印我期望的正确值
2020-12-12
2020-12-12
2013-01-01
但是返回值的类型是错误的。方法的返回值似乎不受影响
System.out.println(getDate("Sat Dec 12 00:00:00 KST 2020"));
上述行再次打印2020年12月12日星期六00:00:00。我不知道转换Java日期类型时哪些代码是错误的。tl;博士
ZoneDateTime
.parse(
“2020年12月12日星期六00:00:00”,
日期时间格式化程序
模式名称(“EEE MMM dd HH:mm:ss zzz UUU”)
.withLocale(Locale.US)
)
.toLocalDate()
.toString()
2020-12-12
避免遗留日期时间类
您正在使用可怕的日期时间类,这些类在几年前被现代java.time类所取代。切勿使用日期、日历或简化格式
你说:
我的目标日期类型是格式为yyyy-MM-dd的Java日期类型
显然,您希望Date
保留一个日期。事实并非如此。java.util.Date
类表示一个时刻,一个日期和UTC中的时间一致。java.sql.Date
类假装只保存一个日期,但实际上它也包含一个日期和UTC中的时间
java.util.Date
类的许多问题之一是其toString
方法的行为。该方法在生成文本时动态应用JVM的当前默认时区。此反功能可能会导致您的困惑
LocalDate
相反,您应该使用java.time.LocalDate
来表示一个只包含日期的值,该值没有一天中的时间,也没有时区或UTC的偏移量
ZoneDateTime
首先使用DateTimeFormatter
类解析整个输入字符串。这会产生一个ZonedDateTime
对象,表示通过特定地区的人们使用的挂钟时间看到的时刻
示例代码
String input=“Sat Dec 12 00:00:00 KST 2020”;
DateTimeFormatter f=带有Locale(Locale.US)的模式的DateTimeFormatter.(“EEE-MMM-dd-HH:mm:ss-zzz-uuuu”);
ZonedDateTime zdt=ZonedDateTime.parse(输入,f);
从该ZonedDateTime
对象中,提取一个LocalDate
LocalDate localDate = zdt.toLocalDate() ;
看这个
zdt.toString():2020-12-12T00:00+09:00[亚洲/首尔]
ld.toString():2020-12-12
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 该项目现已启动,建议迁移到类 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类。Hibernate5和JPA2.2支持java.time
从哪里获得java.time类
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- 带来了一些小功能和修复
- 及
- 大多数java.time功能都在中向后移植到Java6和Java7
-
- Android(26+)的更高版本捆绑了java.time类的实现
- 对于早期的Android(请告诉我这个字符串值的模式是“2020-12-18 16:04:07-06”?我使用@JsonFormat(pattern=“yyyy-MM-dd HH:MM:ss:SSS”。但它引发异常。@Josephwang您的格式模式缺少显示在输入末尾的UTC偏移量的代码。将该输入作为java中的
对象进行分析。@Josephwangjava.time.OffsetDateTime
我建议您不要使用OffsetDateTime.Parse(“2020-12-18 16:04:07-06”。替换(“,“T”))
和SimpleDateFormat
。这些类的设计很差,而且很早就过时了,前者特别麻烦。相反,请使用Date
和ZonedDateTime
,两者都来自。如果需要该输出,可以转换为DateTimeFormatter
LocalDatee> 。它的打印方式类似于
(始终)。2020-12-12