SimpleDateFormat 在解析过程中返回错误的日期值



我遇到了一个问题:我想长时间获取GMT时区的当前时间。 我使用以下代码,如下所示:

TimeZone timeZoneGmt = TimeZone.getTimeZone("GMT");
long gmtCurrentTime = getCurrentTimeInSpecificTimeZone(timeZoneGmt);
public static long getCurrentTimeInSpecificTimeZone(TimeZone timeZone) {
Calendar cal = Calendar.getInstance();
cal.setTimeZone(timeZone);
long finalValue = 0;
SimpleDateFormat sdf = new SimpleDateFormat(
"MMM dd yyyy hh:mm:ss:SSSaaa");
sdf.setTimeZone(timeZone);
Date finalDate = null;
String date = sdf.format(cal.getTime());
try {
finalDate = sdf.parse(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finalValue = finalDate.getTime();
return finalValue;
}

如上述方法所示 格式化
String date = sdf.format(cal.getTime());时 我在 GMT 中获得了正确的当前时间,但当我通过以下代码解析时:

finalDate=sdf.parse(date);

日期已从当前 GMT 时间更改为 15:35:16 IST 2013,这是我系统的当前时间。

我也以另一种方式尝试了日历:

TimeZone timeZoneGmt=TimeZone.get("GMT"); 
Calendar calGmt = Calendar.getInstance(); 
calGmt.setTimeZone(timeZoneGmt); 
long finalGmtValue = 0; 
finalGmtValue = calGmt.getTimeInMillis(); 
System.out.println("Date......" + calGmt.getTime()); 

但仍然将日期作为我的系统的当前时间 星期四 1月 23 日 15:58:16 IST 2014 没有得到格林威治标准时间当前时间。

你误解了Date的工作原理。Date没有时区 - 如果使用Date.toString()始终会看到默认时区。Date中的长整型值纯粹是自 Unix 纪元以来的毫秒数:它没有任何时区或日历系统的概念。

如果要表示特定时区和日历中的日期和时间,请改用Calendar- 但要获取"当前日期和时间作为长篇",您只需使用System.currentTimeMillis(),这又与系统时区没有任何关系。

此外,即使您确实想执行这样的操作,也不应使用字符串转换。您没有在概念上执行任何字符串转换,那么为什么要引入它们呢?

如果您的目标是显示(字符串)特定时区的当前日期和时间,则应使用以下内容:

Date date = new Date(); // This will use the current time
SimpleDateFormat format = new SimpleDateFormat(...); // Pattern and locale
format.setTimeZone(zone); // The zone you want to display in
String formattedText = format.format(date);

在使用日期和时间 API 时 - 特别是像 JavaCalendar/DateAPI 这样的糟糕 API - 准确了解系统中的每个值所代表的内容非常重要

相关内容

  • 没有找到相关文章

最新更新