如何使用java在android应用程序中本地化时间戳?

ndasle7k  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(209)

我正在开发一个应用程序,用户可以在自己的工作场所内或外添加时间戳。目前,我正在尝试完成时间戳的本地化。例如,当我在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”(即时类)来实现我要实现的目标是错误的吗?正确的解决方案是什么?

1u4esq0p

1u4esq0p1#

业余时间

我不明白这是怎么回事 +02:00 在你的字符串中表示。特别是当偏移量改变时,它使我搞不清楚你想做什么。在任何情况下,java.time,现代的java日期和时间api,解析和格式化您的时间非常容易。让我们首先定义描述所需输出格式的格式化程序:

private static final DateTimeFormatter timeFormatter
        = DateTimeFormatter.ofPattern("HH:mm");

有了这个,你可以:

String returntime = "15:00:00+02:00";
    OffsetTime time = OffsetTime.parse(returntime);
    String formattedTime = time.format(timeFormatter);
    System.out.println(formattedTime);

输出:
15:00
偏移量被解析,但不用于任何东西。输出时间将始终与字符串中的时间相同。
我认为您在代码中使用的日期1970-01-01是任意的,没有意义。这个 OffsetTime 我正在使用的没有日期,所以省去了我们选择处理时间的日期。
这里没有进行任何本地化。例如,本地化是指对美国观众而言,打印时间是下午3:00而不是15:00。
编辑:
如果字符串也包含日期, OffsetDateTime 是要使用的正确类,同样,我们不需要显式格式化程序进行解析(仅用于格式化)。注解中的代码很好(只是意外地颠倒了字符串中的日、月和年的顺序)。

String returnDate1 = "2020-12-05T00:00+02:00";
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
    OffsetDateTime dateTime = OffsetDateTime.parse(returnDate1);
    String formattedDate = dateTime.format(dateFormatter);

    System.out.println(formattedDate);

05-12-2020

你的代码哪里出错了?

看来你把事情搞得太复杂了。尤其是你把古老的约会时间和现代的约会时间混在一起。那些旧的, Date 以及 SimpleDateFormat ,设计拙劣且令人困惑,这无疑是导致您意外结果的原因。当混合时,你需要的转换不是你的工作真正需要的,同样只是使你的代码比需要的更复杂。
你的 sdf2 正在使用默认时区打印时间。你得到了补偿 +02:00 因此,当您将手机设置为utc+01:00时,会发生转换。当偏移量+02:00的时间为08:00时,偏移量+01:00的时间仅为07:00。所以这就是你得到的结果。这反过来意味着,如果用户的时区在1970-01-01的偏移量+01:00,那么您就得到了该时区的正确时间。

相关问题