java–DateFormat parse– 不以UTC格式返回日期

java–DateFormat parse– 不以UTC格式返回日期,第1张

概述这里我的java代码尝试在Android设备上以UTC格式获取当前日期:publicstaticDategetCurrentDateUTC(){try{TimeZonetimeZoneUTC=TimeZone.getTimeZone("UTC");DatelocalTime=newDate();DateFormatdateFormat=newSimpleDateFormat("

这里我的java代码尝试在Android设备上以UTC格式获取当前日期:

public static Date getCurrentDateUTC() {    try {        TimeZone timeZoneUTC = TimeZone.getTimeZone("UTC");        Date localTime = new Date();        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z");        dateFormat.setTimeZone(timeZoneUTC);        String dateUTCAsstring = dateFormat.format(localTime);        DeBUG.d(TAG, "getCurrentDateUTC: dateUTCAsstring = " + dateUTCAsstring);        Date dateResult = dateFormat.parse(dateUTCAsstring);        DeBUG.d(TAG, "getCurrentDateUTC: dateResult = " + dateResult);        return dateResult;    } catch (ParseException e) {        DeBUG.e(TAG, "getCurrentDateUTC: ", e);        return null;    }}

结果:

dateUTCAsstring = 2017-11-15T12:54:25 +0000dateResult = Wed Nov 15 14:54:25 EET 2017

正如您所看到的,dateUTCAsstring IS CORRECT以UTC格式显示当前日期,但在解析之后dateResult不正确.为什么?

解决方法:

请原谅我提到它,我怀疑你的代码没有问题,只有混乱.如果您认为旧的Date类表现令人困惑,请允许我成为许多人中第一个同意您的人.这个问题的良好和合理的解决方案是您停止使用Date并开始使用现代Java日期和时间API.

由于您正在为AndroID编写代码,因此您首先要获得ThreeTenABP,即提供现代API的AndroID库(如果您使用的是Java 8或9,则可以跳过此步骤,因为现代API将被内置).详细信息在this question: How to use ThreeTenABP in Android Project中描述.现在您可以:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss Z");    String dateUTCAsstring = "2017-11-15T12:54:25 +0000";    Instant dateResult = OffsetDateTime.parse(dateUTCAsstring, formatter).toInstant();    System.out.println(dateResult);

在我的电脑上打印出来:

2017-11-15T12:54:25Z

最后的Z表示祖鲁时区或UTC.

您可能知道,System.out.println(dateResult)隐式调用dateResult对象的toString方法.类Instant的对象产生上述格式,总是以UTC为单位,正如我所理解的那样.对于大多数用途,Instant类是旧式Date类的自然替代品.在内部,Instant保持自纪元以来的秒数和纳秒数,该纪元定义为1970年1月1日UTC时间午夜0点.我鼓励您将此视为无关的实施细节.瞬间是时间线上的一个点.

什么地方出了错?

您要求提供UTC日期.根据您的看法,您可以或不可以.

>一方面,Date实现为自纪元以来的秒数和毫秒数,因此如果使用上述纪元定义,则可以说它始终为UTC.
>另一方面,您不必担心实施细节.从概念上讲,日期(如瞬发)是时间线上的一个点,并且没有也没有时区或偏移;它不能是UTC.更令人困惑的是,当你执行“getCurrentDateUTC:dateResult =”dateResult时,会隐式调用dateResult.toString().此方法获取JVM的时区设置,并将日期时间转换为此区域,并将其用于生成的字符串(不修改Date对象).这就是为什么无论您尝试打印哪个日期,您都会在计算机或设备上看到EET的时间.

java.time或JsR-310

现代日期和时间API称为java.time或JsR-310.学习使用它的一个好的来源是the Oracle tutorial.

总结

以上是内存溢出为你收集整理的java – DateFormat parse – 不以UTC格式返回日期全部内容,希望文章能够帮你解决java – DateFormat parse – 不以UTC格式返回日期所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1103578.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存