我正在开发一款应用程序,用户可以在该应用程序中标记自己在工作场所的输入或输出时间。目前,我正在努力完成时间戳的本地化。例如,当我在2020年1月2日08:00以UTC+02:00创建时间戳时,它可以正确工作,并将时间显示为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"(即时课程(为了我想要达到的目标?什么是正确的解决方案?
偏移时间
我不明白你字符串中+02:00
的偏移量意味着什么。特别是,当偏移量发生变化时,我很困惑你想做什么。在任何情况下,现代java日期和时间API java.time都可以非常轻松地解析和格式化您的时间。让我们首先定义描述您想要的输出格式的格式化程序:
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,那么你就得到了该时区的正确时间。