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

Roc*_* Hu 5 java timezone datetime date

我只有一个日期字符串,我希望通过它在其他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));
Run Code Online (Sandbox Code Playgroud)

这是我电脑中的当前TimeZone:

在此输入图像描述

代码运行的结果是:

 Fri May 16 06:14:58 CST 2014

 2014-05-16 06:14:58 AM
Run Code Online (Sandbox Code Playgroud)

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

America/Denver —— 2014-05-15 02:14:58 AM
Run Code Online (Sandbox Code Playgroud)

我不知道为什么喜欢这样?

但如果我有一个日期而不是日期字符串,我这样做:

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());
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

结果是对的.

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

Pop*_*ibo 5

  1. Date Java中的对象独立于时区的概念.
  2. 您想要做的是在日期字符串的另一个时区获得相同的时间,该日期字符串应该在您自己的时区中.

但是,第二点在您的代码中显示为倒退:

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);
Run Code Online (Sandbox Code Playgroud)

这4行的作用是将日期字符串视为"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);
Run Code Online (Sandbox Code Playgroud)

将其添加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));
Run Code Online (Sandbox Code Playgroud)

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

输出我得到了更改的代码(我的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
Run Code Online (Sandbox Code Playgroud)