【问题标题】:convert java.util.Date to java.util.Date with different formating in JAVA [duplicate]在JAVA中使用不同格式将java.util.Date转换为java.util.Date [重复]
【发布时间】:2020-11-02 09:04:04
【问题描述】:

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

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

我尝试了以下代码:

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]

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

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

如果是,任何人都可以向我推荐任何好的方法/方向/主题/库来研究。

谢谢你..

【问题讨论】:

  • java.util.Date 本身不包含任何有关格式化的信息。你不能设置它的格式。您只能在要显示时设置格式,也就是转换为字符串。顺便提一句。您可能应该转移到 Java 8 中添加的“新”Java 日期/时间 API(在包 java.time 中)
  • 我只是好奇,你为什么要这么做?
  • @jagapathi :我需要该格式的日期才能通过材料 UI 日期时间本地日历传递给反应 JS 应用程序。
  • @asha 你需要将 react js 中的日期转换为你需要的任何格式。
  • 行业标准是,在您的 JSON 传输中,您应该使用 ISO 8601 格式(最好在 UTC 中使用Z),然后在客户端进行格式设置。这个的默认 JS 库似乎是 Moment。

标签: java date timestamp utc


【解决方案1】:

tl;博士

从传统类转换为现代类。从 UTC 调整到时区。生成标准 ISO 8601 中的文本。我们在输出中省略了时区或偏移的上下文,因为您提出了这样的要求,这违反了我的建议。

myJavaUtilDate
.toInstant()
.atZone( ZoneId.of( "Asia/Kolkata" ) )
.truncatedTo( ChronoUnit.MINUTES ) 
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )

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

myJavaUtilDate
.toInstant()
.toString()

详情

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

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

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

Instant instant = myJUDate.toInstant() ;

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

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ; 
ZonedDateTime zdt = instant.atZone( z ) ;

显然你并不关心分秒。所以让我们将其截断为零秒。

ZonedDateTime zdt = zdt.truncatedTo( ChronoUnit.MINUTES ) ;

生成所需格式的文本。 Java 已经捆绑了格式化程序 defined for your format。

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) ;

我展示了这种格式,因为被问到了。但我不推荐它。该格式无法指示时区或与 UTC 的偏移量。所以如果它说中午,读者不知道这是否意味着日本东京的中午??,法国图卢兹的中午??,或者俄亥俄州托莱多的中午??——三个非常不同的时刻,相隔几个小时。

在传达时间线上的特定时间点时,通常最好使用 UTC。并使用 ISO 8601 标准格式。通常在末尾放置一个Z 来表示 UTC,即零时分秒的偏移量。

Instant instant = zdt.toInstant() ;
String output = instant.toString() ;

【讨论】:

  • 这真的很有帮助...谢谢!!
猜你喜欢
  • 2018-03-06
  • 2012-06-09
  • 2011-10-22
  • 2019-05-05
  • 2015-04-03
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2013-05-22
相关资源
最近更新 更多