我只有一个日期字符串,我希望通过它在其他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:
代码运行的结果是:
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的时间时,我找不到问题。任何身体可以帮助我吗?
答案 0 :(得分:5)
Date
对象独立于时区的概念。但是,第二点在您的代码中显示为向后:
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