SimpleDateFormat在解析期间返回错误的日期值

时间:2014-01-23 10:14:28

标签: java android timezone simpledateformat

我遇到了一个问题:我想长时间获得GMT TimeZone的当前时间。 我使用下面给出的代码:

  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时间更改为2013年IST 2013年15:35:16,这是我系统的当前时间。

我尝试使用日历以另一种方式:

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未获得GMT当前时间。

1 个答案:

答案 0 :(得分:7)

你误解了Date是如何运作的。 Date 没有时区 - 如果您使用Date.toString(),则总是会看到默认时区。 Date中的long值纯粹是自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时 - 特别是像Java Calendar / Date API那样糟糕的 - 它非常非常重要,您可以准确理解系统中的每个值表示。