我把时间从格林尼治标准时间转换到不同的美国时区。为此,我写了一个方法,返回1小时前的时间。如果时间是2:00,它返回1:00
private static Date timeFormat(String timeZone) throws ParseException {
SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
DateFormat gmtFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
gmtFormat.setTimeZone(TimeZone.getTimeZone(TimeZone.getDefault().getID()));
Date date = null;
try {
date = gmtFormat.parse(sdfDate.format(new Date()));
LOG.info("GMT format time and date ==>> "+date);
} catch (ParseException e) {
e.printStackTrace();
}
DateFormat pstFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
pstFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
String timedd = pstFormat.format(date);
LOG.info("Return the new time based on timezone : "+pstFormat.format(date));
return gmtFormat.parse(timedd);
}
谁能告诉我到底是什么问题,因为几个月前同样的方法工作得很好?是因为夏令时吗?
3条答案
按热度按时间bxjv4tth1#
使用java.time API可以以一种更简单的方式完成这一点。使用Instant以UTC表示时间。它可以转换为任何区域的时间,并格式化为特定模式。
6pp0gazn2#
经过这么多的挖掘,我发现时区不会根据时区给予正确的结果
(EST、CST、MST、PST)
所以在我的方法中,我作为timeZone传递的参数是作为
(EST、CST、MST、PST)
我传递了
US/Eastern
US/Pacific
US/Mountain
US/Central
,而不是EST, CST, MST, PST
,它对我来说工作得很好sqxo8psd3#
java.time
使用现代的 java.time 类,而不是有严重缺陷的遗留类。
new Date());
否,使用
Instant
类捕获当前时刻。此类表示从UTC偏移0小时-分钟-秒的时刻。从GMT
在大多数业务应用程序中,GMT等同于UTC。
科学和工程是有区别的,这与我们大多数人无关。
到不同的美国时区
美国及其领土上有许多时区。
真实的时区的名称格式为
Continent/Region
,例如America/Chicago
、America/Juneau
、America/Kentucky/Louisville
、America/Los_Angeles
、Pacific/Guam
。所以你需要说得更具体些。
代码run at Ideone.com
您评论:
CST和PST,但EST和MST的时间不同
这种2-4个字符的伪时区不是真实的的时区名称。它们不是标准化的。它们不是唯一的。请使用上面看到的真正时区名称。