栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将人类日期(当地时间GMT)转​​换为日期

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将人类日期(当地时间GMT)转​​换为日期

NPT不被视为时区缩写

问题是您的日期时间字符串(显然是的输出

Date.toString()
)的解析(不是随后使用
TimeAgo
,您可以从问题中删除它,以使其更清楚)。不可分割的部分在索引20处,即它所说的位置
NPT
,我指的是尼泊尔时间。因此,
SimpleDateFormat
在您的Android设备或仿真器上,无法识别
NPT
为时区缩写。

时区缩写是语言环境数据的一部分。我不是Android开发人员,也不知道Android从何处获取其区域设置数据。快速网络搜索提到了ICU和CLDR。您可以进行更彻底的搜索,无疑可以找到我没有找到的信息。

我提出了三个建议供您尝试。我立即承认前两个不可能解决您的问题,但是我仍然发现它们值得尝试。我保证,如果前两个不起作用,则第三个将起作用。

1.使用ThreeTenABP和java.time

我同意您的回答,即类

Date
SimpleDateFormat
过时了,最好使用
java.time
现代Java日期和时间API。您可以在Android
O之前的Android上执行此操作吗?是的,大多数
java.time
已被反向移植。反向端口的Android版本称为ThreeTenABP。使用底部的链接。然后尝试:

    DateTimeFormatter formatter  = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);    ZonedDateTime newDateTime = ZonedDateTime.parse("Fri Jun 22 09:29:29 NPT 2018", formatter);    System.out.println(newDateTime);

确保将导入用于反向端口:

import org.threeten.bp.ZonedDateTime;import org.threeten.bp.format.DateTimeFormatter;

我已经使用相同的反向端口进行了测试,只有Android版本没有。我有:

2018-06-22T09:29:29 + 05:45 [亚洲/加德满都]

我怀疑ThreeTenABP使用相同的语言环境数据,如果这样的话,这不能解决您的问题。

2.在格式化程序上设置时区

    DateTimeFormatter formatter = DateTimeFormatter .ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT) .withZone(ZoneId.of("Asia/Kathmandu"));

如果可行,我觉得它简单明了。如果您坚持使用

SimpleDateFormat
,可以尝试使用类似的技巧。我得到与上述相同的输出。

3.将NPT作为文字处理

这是一个hack:要求

NPT
字符串中出现三个字母,而不将它们解释为时区。这消除了将缩写识别为时区的需求,因此可以正常工作。

    DateTimeFormatter formatter = DateTimeFormatter .ofPattern("EEE MMM dd HH:mm:ss 'NPT' yyyy", Locale.ROOT) .withZone(ZoneId.of("Asia/Kathmandu"));

我们还需要设置时区,因为现在这是Java唯一可以获取时区的地方。

但是TimeAgo需要一个日期

要获取的老式

Date
对象
TimeAgo
,请按以下方式进行转换:

    Date newDate = DateTimeUtils.toDate(newDateTime.toInstant());


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/440134.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号