用Java获取GMT时间

在Java中,我想获得GMT中的当前时间。

我试过这样的各种选项:

Date date = new Date(); Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); date1 = calendar.getTime(); 

但是日期总是在我当地的时区解释。

我做错了什么以及如何将java Date转换为GMT?

很有可能你在获得日期时在后端做了正确的事情,但没有任何迹象表明你没有按照你机器的当前语言环节那样花费GMT时间并对其进行格式化。

 final Date currentTime = new Date(); final SimpleDateFormat sdf = new SimpleDateFormat("EEE, MMM d, yyyy hh:mm:ss az"); // Give it to me in GMT time. sdf.setTimeZone(TimeZone.getTimeZone("GMT")); System.out.println("GMT time: " + sdf.format(currentTime)); 

关键是使用自己的DateFormat,而不是系统提供的。 这样,您可以将DateFormat的时区设置为您想要的,而不是将其设置为Locale的时区。

我想知道为什么没有人这样做:

 Calendar time = Calendar.getInstance(); time.add(Calendar.MILLISECOND, -time.getTimeZone().getOffset(time.getTimeInMillis())); Date date = time.getTime(); 

根据我的经验,Java中捆绑的Calendar和Date类可以产生不良效果。 如果您不介意升级到Java 8,请考虑使用ZonedDateTime

像这样:

 ZonedDateTime currentDate = ZonedDateTime.now( ZoneOffset.UTC ); 

TL;博士

 Instant.now() 

java.time

Damilola的回答是正确的,建议您使用Java 8及更高版本中内置的java.time框架。 但是,如果您只想要UTC而不是任何特定时区,那么该答案使用ZonedDateTime类是过度的。

麻烦的旧日期时间类现在已经遗留下来,取而代之的是java.time类。

Instant

Instant类表示UTC时间轴上的一个时刻,分辨率为纳秒 (最多九(9)位小数)。

简单代码:

 Instant instant = Instant.now() ; 

instant.toString():2016-11-29T23:18:14.604Z

您可以将Instant视为可以添加时区( ZoneID )以获取ZonedDateTime的构建块。

 ZoneId z = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = instant.atZone( z ); 

关于java.time

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

现在处于维护模式的Joda-Time项目建议迁移到java.time。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参阅如何使用….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。

要获得格林威治标准时间的磨坊时间,您只需要

 long millis = System.currentTimeMillis(); 

你也可以这样做

 long millis = new Date().getTime(); 

 long millis = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTimeInMillis(); 

但这些是进行相同呼叫的低效方式。

在尝试了很多方法之后,我发现,为了在GMT中获得毫秒时间,您需要创建两个单独的SimpleDateFormat对象,一个用于格式化GMT,另一个用于解析。

这是代码:

  SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); format.setTimeZone(TimeZone.getTimeZone("UTC")); Date date = new Date(); SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date dateTime= dateParser.parse(format.format(date)); long gmtMilliSeconds = dateTime.getTime(); 

这很好用。 🙂

这非常简单直接。

 Date date = new Date(); TimeZone.setDefault(TimeZone.getTimeZone("GMT")); Calendar cal = Calendar.getInstance(TimeZone.getDefault()); date = cal.getTime(); 

现在日期将包含当前的GMT时间。

以下有用的Utils方法用于管理GMT中的时间和DST节省:

 public static Date convertToGmt(Date date) { TimeZone tz = TimeZone.getDefault(); Date ret = new Date(date.getTime() - tz.getRawOffset()); // if we are now in DST, back off by the delta. Note that we are checking the GMT date, this is the KEY. if (tz.inDaylightTime(ret)) { Date dstDate = new Date(ret.getTime() - tz.getDSTSavings()); // check to make sure we have not crossed back into standard time // this happens when we are on the cusp of DST (7pm the day before the change for PDT) if (tz.inDaylightTime(dstDate)) { ret = dstDate; } } return ret; } public static Date convertFromGmt(Date date) { TimeZone tz = TimeZone.getDefault(); Date ret = new Date(date.getTime() + tz.getRawOffset()); // if we are now in DST, back off by the delta. Note that we are checking the GMT date, this is the KEY. if (tz.inDaylightTime(ret)) { Date dstDate = new Date(ret.getTime() + tz.getDSTSavings()); // check to make sure we have not crossed back into standard time // this happens when we are on the cusp of DST (7pm the day before the change for PDT) if (tz.inDaylightTime(dstDate)) { ret = dstDate; } } return ret; }