我正在开发一个应用程序,用户可以在自己的工作场所内或外添加时间戳。目前,我正在尝试完成时间戳的本地化。例如,当我在utc+02:00 08:00 02.01.2020中创建一个时间戳时,它工作正常,并将时间显示为08:00和正确的日期。但当我在手机设置中更改为utc+01:00,并使用相同的时间戳时,时间变为07:00,日期变为01.01.2020。
到目前为止,我为“解析”时间而编写的代码如下所示:
String formattedTime = "";
String datetime2 = "1970-01-01T" + returntime;
Log.v("DATE", datetime2);
OffsetDateTime odt2 = OffsetDateTime.parse(datetime2);
Date date2 = Date.from(odt2.toInstant());
SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm",Locale.getDefault());
formattedTime = sdf2.format(date2);
Log.v("FORMTIME", formattedTime);
我也在使用类似的代码片段来“解析”日期。两个日志的输出(utc+01:00时):
V/DATE: 1970-01-01T15:00:00+02:00
V/FORMTIME: 14:00 //SHOULD BE 15:00
V/DATE: 1970-01-01T08:00:00+02:00
V/FORMTIME: 07:00 //SHOULD BE 08:00
V/DATE: 1970-01-01T08:00:00+02:00
V/FORMTIME: 07:00 //SHOULD BE 08:00
似乎utc从+02:00到+01:00的变化也减少了时间和日期1。。。那么,使用offsetdatetime类和“toinstant”(即时类)来实现我要实现的目标是错误的吗?正确的解决方案是什么?
1条答案
按热度按时间1u4esq0p1#
业余时间
我不明白这是怎么回事
+02:00
在你的字符串中表示。特别是当偏移量改变时,它使我搞不清楚你想做什么。在任何情况下,java.time,现代的java日期和时间api,解析和格式化您的时间非常容易。让我们首先定义描述所需输出格式的格式化程序:有了这个,你可以:
输出:
15:00
偏移量被解析,但不用于任何东西。输出时间将始终与字符串中的时间相同。
我认为您在代码中使用的日期1970-01-01是任意的,没有意义。这个
OffsetTime
我正在使用的没有日期,所以省去了我们选择处理时间的日期。这里没有进行任何本地化。例如,本地化是指对美国观众而言,打印时间是下午3:00而不是15:00。
编辑:
如果字符串也包含日期,
OffsetDateTime
是要使用的正确类,同样,我们不需要显式格式化程序进行解析(仅用于格式化)。注解中的代码很好(只是意外地颠倒了字符串中的日、月和年的顺序)。05-12-2020
你的代码哪里出错了?
看来你把事情搞得太复杂了。尤其是你把古老的约会时间和现代的约会时间混在一起。那些旧的,
Date
以及SimpleDateFormat
,设计拙劣且令人困惑,这无疑是导致您意外结果的原因。当混合时,你需要的转换不是你的工作真正需要的,同样只是使你的代码比需要的更复杂。你的
sdf2
正在使用默认时区打印时间。你得到了补偿+02:00
因此,当您将手机设置为utc+01:00时,会发生转换。当偏移量+02:00的时间为08:00时,偏移量+01:00的时间仅为07:00。所以这就是你得到的结果。这反过来意味着,如果用户的时区在1970-01-01的偏移量+01:00,那么您就得到了该时区的正确时间。