转换当前日期和;时间等于GMT日期和;时间

时间:2014-07-04 03:19:28

标签: java

我使用下面的代码,我已在String&中打印修改过的GMT日期。以Date格式,它给了我两个不同的值。

Date initial = new Date();  
DateFormat dateFormatter = DateFormat.getInstance();  
dateFormatter.setTimeZone (TimeZone.getTimeZone("UTC"));  
String gmtS = dateFormatter.format(initial);             
Date gmt = dateFormatter.parse(gmtS);              
System.out.println("Data type is Date    = " + gmt);
System.out.println("Data type is String "+gmtS);

输出

gtm其中{id}}的值id Date gmtS,其中值Thu Jul 03 23:15:00 EDT 2014 = String

但我希望将值7/4/14 3:15 AM)视为7/4/14 3:15 AM类型。 任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:0)

当您通过调用DatetoString()执行此操作)输出System.out.println("Data type is Date = " + gmt);时,您将根据系统时区获得Date,因为这就是Date.toString()返回。

  

将此Date对象转换为以下形式的字符串:

dow mon dd hh:mm:ss zzz yyyy
     

其中:

 ...
 zzz is the time zone (and may reflect daylight saving time). Standard time 
     zone abbreviations include those recognized by the method parse. If time 
     zone information is not available, then zzz is empty - that is, it 
     consists of no characters at all.

因此,为了获得您期望的输出,请再次使用dateFormatterformat

String gmtS = dateFormatter.format(initial);             
Date gmt = dateFormatter.parse(gmtS);              
System.out.println("Data type is Date    = " + dateFormatter.format(gmt));

答案 1 :(得分:0)

tl; dr

Instant.now().toString()
  

2019-02-07T19:15:29.123456Z

避免使用旧的日期时间类

您正在使用非常麻烦的日期时间类,在设计中存在许多缺陷。

首先,您应该知道java.util.Date代表UTC的时刻,根据定义始终代表UTC。但是它的toString方法却说谎,它动态地应用JVM的当前默认时区,同时在Date对象中生成表示时刻的文本。

java.time

现代方法使用 java.time 类。

Instant

使用UTC暂时使用Instant。像java.time.Date一样,它始终以UTC表示一个时刻(但具有较纳秒和毫秒更好的分辨率)。确实,您可以使用添加到旧类中的新方法在DateInstant之间轻松地来回转换。

toString上的Date不同,toString上的Instant方法总是说实话。该方法生成标准ISO 8601格式的文本。中间的T将日期部分与时间部分分开。末尾的Z是UTC的缩写,发音为“ Zulu”。

  

Instant.now()。toString():2019-01-23T12:34:56.123456789Z

OffsetDateTime

Instant类是 java.time 中的基本构建块类,功能有限。如果要使用更灵活的格式,请使用OffsetDateTime类,并将偏移量设置为UTC。

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;

或者跳过Instant类。

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;

要生成表示OffsetDateTime对象值的文本,请使用DateTimeFormatter类。搜索堆栈溢出,因为已经有很多次了。


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore