我有一次约会,比如说
Date date = new Date(); //Thu Mar 31 04:34:37 AKDT 2016
我想把它改到另一个日期:
Thu Mar 31 00:00:00 UTC 2016
意味着我做了两个改变:
我写了这段代码:
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
。
我怎么做到这一点?
发布于 2016-03-31 13:38:04
您应该在格式化程序中指定时区和适当的格式,并根据该格式输出:
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。
发布于 2016-03-31 13:52:50
这看起来像是打印/字符串转换的问题。
在内部,Calendar
和Date
将将日期时间存储为自该时代(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
。
在我看来,您的代码是正确的,返回的Date
的getTime()
应该是1459382400000
。在您的示例中,您可以使用date.getGMTString()
快速检查,该date.getGMTString()
应该打印Mar 31 00:00:00 UTC 2016
。
https://stackoverflow.com/questions/36334033
复制相似问题