获取其他TimeZone的日期字符串的时间,结果是错误的

时间:2014-05-15 08:35:35

标签: java date datetime timezone

我只有一个日期字符串,我希望通过它在其他TimeZone中查看时间。所以我这样做了:

    String dateStr = "2014-05-15 16:14:58 PM";
    SimpleDateFormat sdf =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
    sdf.setTimeZone(TimeZone.getTimeZone("America/Denver"));
    Date date = sdf.parse(dateStr);
    System.out.println(date);

    SimpleDateFormat sdf1 =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
    System.out.println(sdf1.format(date));

这是我电脑中的当前TimeZone:

enter image description here

代码运行的结果是:

 Fri May 16 06:14:58 CST 2014

 2014-05-16 06:14:58 AM

结果是错误的,我通过在计算机中将TimeZone更改为“America / Denver”得到了正确的结果,我看到了:

America/Denver —— 2014-05-15 02:14:58 AM

我不知道为什么会这样?

但如果我的日期不是日期字符串,我会这样做:

public static String getFormatedDateString(String _timeZone) {
    TimeZone timeZone = null;
    if (StringUtils.isEmpty(_timeZone)) {
        timeZone = TimeZone.getDefault();
    } else {
        timeZone = TimeZone.getTimeZone(_timeZone);
    }

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
    sdf.setTimeZone(timeZone);
    // TimeZone.setDefault(timeZone);
    return sdf.format(new Date());
}

System.out.println(“America / Denver - ”+ getFormatedDateString(“America / Denver”));

结果如下:

------Asia/Shanghai------
2014-05-15 16:32:04 PM (current date)
America/Denver —— 2014-05-15 02:32:04 AM

这个结果是对的。

所以我很困惑,当我只有一个日期字符串并且我想知道其他TimeZone的时间时,我找不到问题。任何身体可以帮助我吗?

1 个答案:

答案 0 :(得分:5)

    Java中的
  1. Date对象独立于时区的概念。
  2. 你想要做的是在一个日期字符串的另一个时区得到相同的时间,该日期字符串被认为是'在你自己的时区。
  3. 但是,第二点在您的代码中显示为向后:

    String dateStr = "2014-05-15 16:14:58 PM";
    SimpleDateFormat sdf =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
    sdf.setTimeZone(TimeZone.getTimeZone("America/Denver"));
    Date date = sdf.parse(dateStr);
    

    这四行所做的是将日期字符串视为" America / Denver"时区。

    当你将它解析为日期对象时,它会在你自己的时区给你相同的时间。

    你反过来想要它:

    因此保持接近您的代码(您可以有效地使用单个SimpleDateFormat实例,稍后您可以知道),

    setTimezone放在第一个sdf:

    String dateStr = "2014-05-15 16:14:58 PM";
    SimpleDateFormat sdf =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
    //sdf.setTimeZone(TimeZone.getTimeZone("America/Denver"));
    Date date = sdf.parse(dateStr);
    System.out.println(date);
    

    将相同的setTimezone添加到其他sdf

    SimpleDateFormat sdf1 =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
    sdf1.setTimeZone(TimeZone.getTimeZone("America/Denver"));
    System.out.println(sdf1.format(date));
    

    现在,您将日期字符串解析为当前(JVM' s)时区中的日期。然后将相同的日期格式化为不同的时区的字符串。

    输出我得到改变的代码(我的JVM'时区是IST):

    Thu May 15 16:14:58 IST 2014 // Parsed the date string in IST
    2014-05-15 04:44:58 AM // Equivalent time in Denver