用Java获取GMT时间

nar*_*nan 27 java date gmt

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

我试过这样的各种选项:

Date date = new Date();
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
date1 = calendar.getTime();
Run Code Online (Sandbox Code Playgroud)

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

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

Edw*_*uck 33

很有可能你在获得日期时在后端做了正确的事情,但没有任何迹象表明你没有采用GMT时间并根据你机器当前的语言环境进行格式化.

final Date currentTime = new Date();

final SimpleDateFormat sdf =
        new SimpleDateFormat("EEE, MMM d, yyyy hh:mm:ss a z");

// Give it to me in GMT time.
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println("GMT time: " + sdf.format(currentTime));
Run Code Online (Sandbox Code Playgroud)

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

  • `long millis = System.currentTimeMillis();`将返回自1970年1月1日00:00:00.000 UTC以来经过的毫秒数.UTC时间是大多数人在说"GMT时间"时真正想要的.`java.util.Date`有一个`getTime()`方法,它为任意的`Date`做同样的事情.您可能需要使用`java.util.Calendar`来构建`Date`对象,具体取决于您的需要,如果是这样的话`Calendar's``getTime()`方法将返回一个`Date`然后你可以`getTime() `获得毫秒偏移量. (3认同)

Har*_*run 19

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

Calendar time = Calendar.getInstance();
time.add(Calendar.MILLISECOND, -time.getTimeZone().getOffset(time.getTimeInMillis()));
Date date = time.getTime();
Run Code Online (Sandbox Code Playgroud)

更新:自Java 8,9,10及更多版本以来,Java应该有更好的替代方案.感谢您对@humanity的评论


Dam*_*ola 7

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

像这样:

ZonedDateTime currentDate = ZonedDateTime.now( ZoneOffset.UTC );
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

tl; dr

Instant.now()
Run Code Online (Sandbox Code Playgroud)

java.time

Damilola答案在建议您使用Java 8和更高版本中内置的java.time框架方面是正确的。但是,ZonedDateTime如果您只想使用UTC而不是任何特定的时区,那么Answer将使用过大的类。

麻烦的旧日期时间类现在已被遗留,由java.time类取代。

Instant

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

简单的代码:

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

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

您可以将其Instant视为可添加时区(ZoneID)的构建基块ZonedDateTime

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

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

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

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

在哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多