当我创建一个新的Date对象时,它被初始化为当前时间,但在本地时区。如何获得当前的GMT日期和时间?


当前回答

这是我的toUTC的实现:

    public static Date toUTC(Date date){
    long datems = date.getTime();
    long timezoneoffset = TimeZone.getDefault().getOffset(datems);
    datems -= timezoneoffset;
    return new Date(datems);
}

可能有几种方法可以改进它,但它对我来说是有效的。

其他回答

这是我的实现:

public static String GetCurrentTimeStamp()
{
    Calendar cal=Calendar.getInstance();
    long offset = cal.getTimeZone().getOffset(System.currentTimeMillis());//if you want in UTC else remove it .
    return new java.sql.Timestamp(System.currentTimeMillis()+offset).toString();    
}

date没有特定的时区,尽管它的值通常被认为与UTC有关。你凭什么认为现在是当地时间?

准确地说:java.util.Date中的值是自Unix epoch(发生在UTC时间1970年1月1日午夜)以来的毫秒数。同样的纪元也可以用其他时区来描述,但是传统的描述是用UTC来表示的。因为它是从一个固定的纪元开始的毫秒数,所以java.util.Date中的值在世界各地的任何特定时刻都是相同的,而不考虑当地的时区。

我怀疑问题是您通过使用本地时区的Calendar实例来显示它,或者可能使用同样使用本地时区的Date.toString(),或者默认情况下也使用本地时区的SimpleDateFormat实例。

如果这不是问题,请发布一些示例代码。

不过,我还是建议您使用Joda-Time,它提供了更清晰的API。

为了简单起见,你可以使用Calendar来创建一个UTC Date:

Calendar.getInstance(TimeZone.getTimeZone("UTC"));

它将使用“UTC”时区为Calendar构造一个新实例。

如果需要该日历中的Date对象,可以使用getTime()。

:

Calendar cal = Calendar.getInstance();

然后就可以得到当前的日期和时间。 您还可以获得当前日期和时间的时区:

Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone("GMT-2"));

你可以问cal.get(Calendar.DATE);或其他日历常量关于其他细节。 日期和时间戳在Java中已弃用。它不是日历类。

简单来说。一个日历对象存储关于时区的信息,但是当你执行cal.getTime()时,时区信息将会丢失。所以对于时区转换,我建议使用DateFormat类…