首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将日期的时区替换为其他时区,日期应相同

将日期的时区替换为其他时区,日期应相同
EN

Stack Overflow用户
提问于 2016-03-31 12:51:00
回答 2查看 161关注 0票数 1

我有一次约会,比如说

代码语言:javascript
运行
复制
Date date = new Date(); //Thu Mar 31 04:34:37 AKDT 2016

我想把它改到另一个日期:

代码语言:javascript
运行
复制
Thu Mar 31 00:00:00 UTC 2016

意味着我做了两个改变:

  1. 重置时间为00
  2. 休息时区至世界协调时,但日期应相同,即31。

我写了这段代码:

代码语言:javascript
运行
复制
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND,0);
        calendar.clear(Calendar.MILLISECOND);
        return calendar.getTime();

但它给了Wed Mar 30 10:30:00 AKDT 2016,但我想要Wed Mar 31 00:00:00 UTC 2016

我怎么做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2016-03-31 13:38:04

您应该在格式化程序中指定时区和适当的格式,并根据该格式输出:

代码语言:javascript
运行
复制
Date date = new Date();
TimeZone utc = TimeZone.getTimeZone("UTC");
Calendar calendar = Calendar.getInstance(utc);
calendar.setTime(date);

// ... erase time as you do now

// here is a format you need (taken from `Date.toString()`)
DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
df.setTimeZone(utc);
System.out.println(df.format(calendar.getTime()));  // Thu Mar 31 00:00:00 UTC 2016

当您尝试将Date打印为date.toString()时,总是会在默认时区中得到结果,因为Date本身只是时间的一部分,并且不保存任何关于时区的信息。

如果您只需要将当前的日期时间调整为UTC中的午夜,则代码是正确的。10:30:00 AKDT不应该把你搞糊涂--它只意味着当UTC午夜时分,在你的时区是10:30。

票数 4
EN

Stack Overflow用户

发布于 2016-03-31 13:52:50

这看起来像是打印/字符串转换的问题。

在内部,CalendarDate将将日期时间存储为自该时代(1970年1月1日,00:00 GMT)以来的毫秒。当将Date转换为字符串时,输出将始终被转换为您的时区的

您的日期Thu Mar 31 04:34:37 AKDT 2016存储为(1459427677000),并将打印运行在CEST时区中的JVM的Thu Mar 31 14:34:37 CEST 2016

在我看来,您的代码是正确的,返回的DategetTime()应该是1459382400000。在您的示例中,您可以使用date.getGMTString()快速检查,该date.getGMTString()应该打印Mar 31 00:00:00 UTC 2016

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36334033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档