热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gmtjavadate_关于日期:以Java获取GMT时间

在Java中,我想获取格林尼治标准时间的当前时间。我尝试了各种选择,例如:DatedatenewDate();Calendarcalend

在Java中,我想获取格林尼治标准时间的当前时间。

我尝试了各种选择,例如:

Date date = new Date();

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));

date1 = calendar.getTime();

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

我在做什么错,如何将Java Date转换为GMT?

System.currentTimeMillis(),或仅是新的Date()。 它的格林尼治标准时间已经。

仅供参考,现在麻烦的旧日期时间类(例如java.util.Date,java.util.Calendar和java.text.SimpleDateFormat)已成为旧版,由Java 8和更高版本中内置的java.time类取代。 请参见Oracle教程。

奇怪的是,您在获取日期方面在后端做了正确的事情,但是没有任何迹象表明您没有花费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));

关键是使用您自己的DateFormat,而不是系统提供的日期格式。这样,您可以将DateFormat的时区设置为所需的时间,而不是将其设置为语言环境的时区。

我希望以毫秒为单位的格林尼治标准时间日期有效吗?

long millis = System.currentTimeMillis();将返回自1 January 1970, 00:00:00.000 UTC起经过的毫秒数。 UTC时间是大多数人说" GMT时间"时真正想要的。 java.util.Date具有getTime()方法,该方法对任意Date执行相同的操作。根据您的需要,您可能需要使用java.util.Calendar来构造Date对象,如果是这样的话,则Calendars getTime()方法将返回Date,然后您可以通过getTime()来获取毫秒偏移量。

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

Calendar time = Calendar.getInstance();

time.add(Calendar.MILLISECOND, -time.getTimeZone().getOffset(time.getTimeInMillis()));

Date date = time.getTime();

更新:

由于Java 8,9,10及更高版本,因此应该有Java支持的更好的替代方案。感谢您的评论@humanity

我尝试了几种方法来实现此目的,但只有您的解决方案能完美地工作

这种方法的一个问题是时间序列化时它不会更改时区。

仅供参考,现在麻烦的旧日期时间类(例如java.util.Date,java.util.Calendar和java.text.SimpleDateFormat)已经成为旧版,被Java 8和更高版本中内置的java.time类取代。请参见Oracle教程。

根据我的经验,Java中捆绑的Calendar和Date类可能产生不必要的效果。

如果您不介意升级到Java 8,请考虑使用ZonedDateTime

像这样:

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

TL;博士

Instant.now()

java.time

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

麻烦的旧日期时间类现在已被遗留,由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添加了一些次要功能和修复。

Java SE 6和SE 7

java.time的许多功能在ThreeTen-Backport中都被反向移植到Java 6和7。

Android的

ThreeTenABP项目专门针对Android改编了ThreeTen-Backport(如上所述)。

请参阅如何使用…。

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

在尝试了许多方法之后,我发现,要在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();

这很好。 :)

要在格林尼治标准时间获得毫秒的时间,您需要做的是

long millis = System.currentTimeMillis();

你也可以

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

long millis =

Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTimeInMillis();

但是这些都是拨打相同电话的低效率方式。

这个答案是不正确的。尝试从长毫秒打印新的Date(millis)= Calendar.getInstance(TimeZone.getTimeZone(" GMT"))。getTimeInMillis();它仍然给出当前时区时间。

@JavaEnthusiast ideone.com/seLqnz给出了格林尼治标准时间,而不管时区如何。

所有这些都给了我当地的时区,而不是格林尼治标准时间。

@ Forseth11这是不正确的。除非您的系统时钟设置不正确,否则它们都是GMT。

@PeterLawrey我的坏。我使用本地时区中的日期格式来显示时间。抱歉。

你不能

首先,您要问不可能的事情。没有老式的Date对象,因为不能具有时区或GMT偏移量。

But the date is always is interpreted in my local time zone.

我想您已经打印了Date或做了其他隐式调用它的方法。我相信这是在您的时区中唯一解释Date的时间。更准确地说,是在JVM的当前默认时区中。另一方面,这是不可避免的。 Date.toString()确实以这种方式运行,它获取了JVM的时区设置,并将其用于呈现要返回的字符串。

你可以用java.time

不过,您不应使用Date。该课程的设计不佳,幸运的是已经过时了。还有java.time,它是代替它的现代Java日期和时间API,它具有一两个用于日期和时间的类,它们与GMT或UTC有偏移。我现在认为GMT和UTC是同义词,严格来说,它们不是。

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

System.out.println("Time now in UTC (GMT) is" + now);

当我刚运行此代码段时,输出为:

Time now in UTC (GMT) is 2019-06-17T11:51:38.246188Z

输出的尾随Z表示UTC。

链接

Oracle教程:Date Time说明如何使用java.time。

在timeanddate.com上,格林尼治标准时间与世界标准时间之间的差异。

在Java 8之后,您可能希望获取如下所示的格式化时间:

DateTimeFormatter.ofPattern("HH:mm:ss.SSS").format(LocalTime.now(ZoneId.of("GMT")));

以下有用的Utils方法可通过DST节省在GMT中管理时间:

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;

}

java.util.Date已经在UTC中。这段代码对我来说毫无意义。

这非常简单直接。

Date date = new Date();

TimeZone.setDefault(TimeZone.getTimeZone("GMT"));

Calendar cal = Calendar.getInstance(TimeZone.getDefault());

date = cal.getTime();

现在日期将包含当前格林尼治标准时间。



推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • NotSupportedException无法将类型“System.DateTime”强制转换为类型“System.Object”
    本文介绍了在使用LINQ to Entities时出现的NotSupportedException异常,该异常是由于无法将类型“System.DateTime”强制转换为类型“System.Object”所导致的。同时还介绍了相关的错误信息和解决方法。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
author-avatar
651404449_724afc
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有