首页 > 解决方案 > 从字符串转换为日期对象不显示预期结果

问题描述

我搜索了解决方案但仍然无法正常工作,我正在尝试将日期对象的本地时区转换为 UTC +0,但是当我将日期对象格式化为 UTC 时,它正在工作。但是当我想再次将转换后的字符串转换为日期时,格式会发生变化,并且 UTC 在我将其存储在火存储之前会返回到 GMT+8。代码中有什么问题?

这是我得到的当前日期对象

Calendar time = Calendar.getInstance();
time.setTimeZone(TimeZone.getTimeZone("UTC"));
Date current_time = time.getTime();

如果打印

Thu Aug 22 10:09:55 GMT+08:00 2019

然后我将其转换为 UTC

String dismissal_time_firestore;
Log.i(TAG, "Current time when swiped from phone time.getTime()  "+current_time);
SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
dismissal_time_firestore = dateFormat.format(current_time);

明白啦

Thu, 22 Aug 2019 02:09:55 +0000

但是当我将此字符串转换为日期对象时

try {
     current_time = dateFormat.parse(dismissal_time_firestore);
    } catch (ParseException e) {
      e.printStackTrace();
    }

我懂了

 Thu Aug 22 10:09:55 GMT+08:00 2019

标签: javadatetimetimezoneutc

解决方案


您正在使用糟糕的日期时间类,这些类在几年前被JSR 310 中定义的现代java.time类所取代。

您的主要问题是不了解该Date::toString方法对您而言。它在生成文本时将 JVM 的当前时区动态应用到 UTC 时刻。从不使用此类的众多原因之一。

获取 UTC 中的当前时刻。

Instant instant = Instant.now() ;

在特定地区(时区)的人们使用的挂钟时间中查看那个时刻。

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

生成文本以显示给用户。

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( Locale.CANADA_FRENCH ) ;
String output = zdt.format( f ) ;

您谈论解析格式化的字符串。馊主意。仅将日期时间值的文本表示视为输出,而不是输入。收集日期时间输入应该通过使用日期时间小部件来完成,而不是输入文本。

将日期时间值存储或交换为文本时,请始终使用ISO 8601标准格式。java.time类在解析/生成字符串时默认使用 ISO 8601 格式。因此无需指定任何格式模式。只需调用parse/ toString。示例:Instant.now().toString()Instant.parse( "2020-01-23T12:34:56.123456Z" )

我无法提供进一步的帮助,因为您并没有真正说出您要完成的工作。

所有这些都在 Stack Overflow 上多次介绍过。因此,搜索以了解更多信息。并在发布前搜索。

Java(传统和现代)和标准 SQL 中的日期时间类型表


推荐阅读