在 JAVA 中使用不同的格式将 java.util.Date 转换为 java.util.Date

Ash*_*sha 0 java timestamp date utc

我得到日期为 java.util.Date(not String) : (java.util.Date) Mon Jul 13 00:00:00 IST 2020

我想将其转换为:2020-07-13T00:00 格式==>("yyyy-MM-dd'T'HH:mm") 但作为日期而不是字符串。

我尝试了以下代码:

Date scheduleDate=details.getScheduledDate();                       // This value is fetched from object passed-- [scheduleDate = (java.util.Date) Mon Jul 13 00:00:00 IST 2020]

SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm");
sd.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
String dateFormat=sd.format(scheduleDate);                           //Here I get [dateFormat = (java.lang.String) "2020-07-13T00:00"]
Date date = sd.parse(dateFormat);                                    //[date = (java.util.Date) Mon Jul 13 00:00:00 IST 2020]
Run Code Online (Sandbox Code Playgroud)

我观察到字符串格式具有正确的(如预期的)值,但是当我将其转换为 java.util.date 时,该值又变回来了。

java.util.Date 是否支持yyyy-MM-dd'T'HH:mm格式?

如果是的话,任何人都可以向我建议任何好的方法/方向/主题/图书馆来研究。

谢谢你..

Bas*_*que 6

tl;博士

从遗留类转换为现代类。从 UTC 调整到时区。以标准 ISO 8601 生成文本。我们在输出中省略了时区或偏移量的上下文,因为您如此要求,与我的建议相反。

myJavaUtilDate
.toInstant()
.atZone( ZoneId.of( "Asia/Kolkata" ) )
.truncatedTo( ChronoUnit.MINUTES ) 
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
Run Code Online (Sandbox Code Playgroud)

我希望使用 UTC 并包括偏移量会更明智。

myJavaUtilDate
.toInstant()
.toString()
Run Code Online (Sandbox Code Playgroud)

细节

日期时间对象没有格式,只有文本有格式。

使用java.time类,从不使用java.util.Date

将您的旧Date对象转换为其现代替代品java.time.Instant.

Instant instant = myJUDate.toInstant() ;
Run Code Online (Sandbox Code Playgroud)

从 UTC 调整到您想要的时区。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ; 
ZonedDateTime zdt = instant.atZone( z ) ;
Run Code Online (Sandbox Code Playgroud)

显然你不关心分钟的秒数。因此,让我们将其截断为零秒。

ZonedDateTime zdt = zdt.truncatedTo( ChronoUnit.MINUTES ) ;
Run Code Online (Sandbox Code Playgroud)

以您想要的格式生成文本。Java 捆绑了一个已经为您的格式定义的格式化程序

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) ;
Run Code Online (Sandbox Code Playgroud)

我展示了这种格式,因为有人问过。但我不推荐它。该格式无法指示时区或与 UTC 的偏移量。因此,如果它说中午,读者不知道是指日本东京的中午、法国图卢兹的中午还是美国俄亥俄州托莱多的中午——三个截然不同的时刻,相隔几个小时。

当交流一个时刻,时间线上的一个特定点时,文本上通常最好在 UTC 中进行。并使用 ISO 8601 标准格式。通常将 aZ放在末尾以指示 UTC,零时分秒的偏移量。

Instant instant = zdt.toInstant() ;
String output = instant.toString() ;
Run Code Online (Sandbox Code Playgroud)