Android:更改日期字符串的时区

时间:2012-03-01 19:44:29

标签: android timezone

我现在已经尝试了大约一个小时,但它似乎没有正常工作。

我基本上是从数据库中读取日期字符串,格式为yyyy-MM-dd HH:mm:ss(2012-03-01 14:32:00)。

此时我所拥有的只是字符串,没有时区信息。这个时间是在我们的服务器上创建的,并最终进入设备数据库,我知道它是东部标准时间。

所以我基本上尝试了以下代码:

SimpleDateFormat sourceFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
        sourceFormat.setTimeZone(TimeZone.getTimeZone("EST"));

        Date parsed = sourceFormat.parse("2012-03-01 10:18:14"); 

        TimeZone tz = TimeZone.getDefault(); 
        SimpleDateFormat destFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
        destFormat.setTimeZone(tz);  

        String result = destFormat.format(parsed);

        Log.v("TZ", result);

我的模拟器是EST,所以当我记录时间显示2012-03-01 10:18:14,这是正确的。

但如果我将sourceFormat的时区更改为America / Los Angeles,我会得到2012-03-01 05:18:14的输出。

现在我不是专家,但我很确定洛杉矶比蒙特利尔(我们办公室所在的EST)落后3小时。所以,如果我花时间在2012-03-01 10:18:14并将其称为美国/洛杉矶时间,那么将其转换为EST我希望看到2012-03-01 13:18:14。

发生了什么事?

任何帮助都将不胜感激。

非常感谢。

1 个答案:

答案 0 :(得分:0)

如果你还没有解决这个问题,那么从JDK 1.2开始不推荐使用三个字母的时区ID(例如,在你的情况下,“EST”),因为相同的缩写通常用于多个时区(例如,“CST”可以是美国“中央标准时间”和“中国标准时间”),然后Java平台只能识别其中一个。因此,即使您提供sourceFormat.setTimeZone(TimeZone.getTimeZone("EST"));,代码也会将您的时区默认为GMT。

为避免这种情况,您可以尝试用 -
替换3个字母的区域ID 常规时区格式:sourceFormat.setTimeZone(TimeZone.getTimeZone("GMT-05:00"));

RFC 822时区格式:sourceFormat.setTimeZone(TimeZone.getTimeZone("-05"));