当我创建一个新的Date对象时,它被初始化为当前时间,但在本地时区。如何获得当前的GMT日期和时间?
当前回答
这适用于在Android中获取UTC毫秒。
Calendar c = Calendar.getInstance();
int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);
Long utcMilliseconds = c.getTimeInMillis() + utcOffset;
其他回答
当我需要输出一个Date对象时,这就是我这样做的方式,通常情况下,您需要在SQL数据库中保存一个日期,而我希望它是UTC。我只是减去当地时区的偏移时间。
ZonedDateTime now = ZonedDateTime.now();
Date nowUTC = new Date(1000 * (now.toEpochSecond() - now.getOffset().getTotalSeconds()));
- - -更新 巴兹尔建议用一种更清洁的方式来达到同样的效果
Date nowUTC = Date.from(ZonedDateTime.now().toInstant());
但是在非utc java系统环境中测试后,我看到结果并不相同。根据巴兹尔的代码,日期仍然在本地区域
为了简单起见,你可以使用Calendar来创建一个UTC Date:
Calendar.getInstance(TimeZone.getTimeZone("UTC"));
它将使用“UTC”时区为Calendar构造一个新实例。
如果需要该日历中的Date对象,可以使用getTime()。
public static void main(String args[]){
LocalDate date=LocalDate.now();
System.out.println("Current date = "+date);
}
date没有特定的时区,尽管它的值通常被认为与UTC有关。你凭什么认为现在是当地时间?
准确地说:java.util.Date中的值是自Unix epoch(发生在UTC时间1970年1月1日午夜)以来的毫秒数。同样的纪元也可以用其他时区来描述,但是传统的描述是用UTC来表示的。因为它是从一个固定的纪元开始的毫秒数,所以java.util.Date中的值在世界各地的任何特定时刻都是相同的,而不考虑当地的时区。
我怀疑问题是您通过使用本地时区的Calendar实例来显示它,或者可能使用同样使用本地时区的Date.toString(),或者默认情况下也使用本地时区的SimpleDateFormat实例。
如果这不是问题,请发布一些示例代码。
不过,我还是建议您使用Joda-Time,它提供了更清晰的API。
这是我的toUTC的实现:
public static Date toUTC(Date date){
long datems = date.getTime();
long timezoneoffset = TimeZone.getDefault().getOffset(datems);
datems -= timezoneoffset;
return new Date(datems);
}
可能有几种方法可以改进它,但它对我来说是有效的。
推荐文章
- 在maven中安装mvn到底做什么
- 不可变与不可修改的集合
- 如何在JSON中使用杰克逊更改字段名
- GSON -日期格式
- 如何从线程捕获异常
- 无法解析主机"<URL here>"没有与主机名关联的地址
- 如何在Java中打印二叉树图?
- String.format()在Java中格式化双重格式
- com.jcraft.jsch.JSchException: UnknownHostKey
- Java中的操作符重载
- 如何加速gwt编译器?
- 在Hibernate中重新连接分离对象的正确方法是什么?
- 应该……接住环内还是环外?
- 如何格式化Joda-Time DateTime仅为mm/dd/yyyy?
- 如何在POM.xml中引用环境变量?