用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.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
- Java SE 8和SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
- 请参阅如何使用….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。
要获得格林威治标准时间的磨坊时间,您只需要
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; }