【发布时间】:2016-03-02 09:26:03
【问题描述】:
我在尝试解析日期字符串时遇到了这个奇怪的问题,我已经确定了这一点:
具有一些英语语言环境的设备(模拟器):
Date.toString() 给出“2016 年 2 月 18 日星期四 13:25:22 GMT”
DateFormat newDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
d1 = newDateFormat.parse("Thu Feb 18 13:25:22 GMT 2016"); //works fine
使用德语区域设置的设备:
Date.toString() 给出“Thu Feb 18 13:25:22 MEZ 2016”(注意德语时区,而星期四仍然是星期四)
DateFormat newDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
d1 = newDateFormat.parse("Thu Feb 18 13:25:22 MEZ 2016"); //does not parse
DateFormat newDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.GERMAN);
d1 = newDateFormat.parse("Thu Feb 18 13:25:22 MEZ 2016"); //does not parse
DateFormat newDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
String s = "Thu Feb 18 13:25:22 MEZ 2016";
s.replace("MEZ", "CET");
d1 = newDateFormat.parse(s); //works fine, but doesn't seem very portable
所以我正在寻找一种方法让 SimpleDateFormat 完全忽略时区(这对我的应用程序来说很好,我在这里要做的唯一事情就是给“上次”一个时间差,这如果少于一天,将以小时为单位,但如果超过一天,则以几天或几周为单位,因此对于这个用例来说,时区并不重要),
或获取SimpleDateFormat 以了解设备语言中的时区的方法。
奖励积分是一种以独立于语言的方式保存日期的好方法,同时仍保留该时区中的时区和一天中的时间等信息。 (下次我升级数据库时)
【问题讨论】:
-
“以与语言无关的方式保存日期的好方法,同时仍保留该时区中的时区和一天中的时间等信息”iso8601 日期时间格式是您的答案跨度>
-
在字符串
String s = "Thu Feb 18 13:25:22 MEZ 2016";你为什么要用MEZ替换CET,你为什么要更改那个时间的时区?这是错误的,因为该时间戳适用于 MEZ 时区,而您只是将其替换为 CET 时区 -
MEZ 和 CET 是同一个东西,只是用两种不同的语言
-
您是否只是想弄清楚如何使用时区保存任何给定的 Date 对象,或者您实际上是否必须使用来自不同语言环境的日期/时间组件来解析这些字符串?
-
好吧,由于开始编写应用程序时的设计选择不佳,这些字符串都在我的数据库中。现在我当然知道以更好的格式保存它们会是一个更好的主意,例如 +0100 之类的,但是要在我的数据库中更改它,我必须弄清楚如何正确解析它们(或蛮力字符串替换所有可能最终出现在数据库中的时区字符串......这就是我最终所做的,但我想我会为有同样问题的人保留这个问题)
标签: android date locale timestamp-with-timezone