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()); 我得到正确的格林尼治标准时间正确的时间,但正如我解析下面的代码:

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()); 

但仍然获得日期作为我系统的当前时间Thu Jan 23 15:58:16 IST 2014没有得到GMT当前时间。


你误解了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时 - 尤其是Java Calendar / Date API等糟糕的CalendarDate API - 非常重要的一点是,您必须准确理解系统中每个值的含义。

链接地址: http://www.djcxy.com/p/18605.html

上一篇: SimpleDateFormat returns wrong date value during parse

下一篇: Invalid date value after parse