Java - 从不同于本地的时区转换为UTC

时间:2015-11-05 12:01:58

标签: java timezone utc

所以我在所有帖子中都读到了这个问题(例如,Convert timestamp to UTC timezone)。

我了解到这种转换的方法是:

SimpleDateFormat dfmaputo = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss a");
dfmaputo.setTimeZone(TimeZone.getTimeZone("UTC"));
long unixtime = dfmaputo.parse(data.get(1)).getTime();
unixtime = unixtime / 1000;

output: 
original date (Maputo Timezone) -- 11/5/2015 1:39:45 PM
unix timestamp in UTC --- 1446687585
data.get(1) is the string with the maputo datetime.

我不明白为什么我没有得到UTC值。当我转换unix时间戳时,我期望使用UTC,我使用马普托时区获得原始日期时间。

我错过了什么吗?

我是否需要先转换为我当地的时区而不是UTC?

编辑:解决方案

Calendar maputoDateTime = Calendar.getInstance(TimeZone.getTimeZone("Africa/Maputo"));
maputoDateTime.setTimeZone(TimeZone.getTimeZone("GMT"));
Long unixtimeGMT = maputoDateTime.getTimeInMillis() / 1000;

我应该使用Calendar。

而不是SimpleDateFormat

首先,我需要设置输入日期的时区(非洲/马普托),然后将其设置为我需要的时间(GMT)。只有这样我才能获得正确的unix时间戳。

感谢How to change TIMEZONE for a java.util.Calendar/Date

中的@BastiM回复

感谢您的回复和帮助。

1 个答案:

答案 0 :(得分:0)

如果您将CAT时区标识符添加到字符串末尾并且格式化程序掩码中有z个字母,该怎么办?如果这就是你总是得到的和源数据没有给出时区值。

    String sdt = "11/5/2015 11:39:45 PM CAT";
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a z", Locale.US);
    Date dt = sdf.parse(sdt);
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(dt.getTime());
    System.out.println(dt + ", utc=" + dt.getTime());
    System.out.println(cal);