这个问题在这里已经有答案了:
如何将日期转换为utc(2个答案)
56分钟前关门了。
下面是我的应用程序中的java pojo:
public class Appointment {
private Date appointmentStartDatetime;
private String timezone;
//...
}
这两个属性的示例值为:
2021-10-06 05:30:00
"America/New_York"
``` `appointmentStartDatetime` 表示在其声明的时区中的约会开始时间-即,在纽约,约会从5:30开始。
我想把它转换成utc日期。
为了做到这一点,下面的说明是否正确?
public static Date dateToUTC(Date date, String timezoneId){
Calendar calendar = Calendar.getInstance();
TimeZone timeZone = TimeZone.getTimeZone(timezoneId);
calendar.setTimeZone(timeZone);
return new Date(date.getTime() - calendar.getTimeZone().getOffset(date.getTime()));
}
方法调用如下:
Date utcDate = dateToUTC(appointment.getEventStartDatetime(),appointment.getTimezone())
2条答案
按热度按时间hpxqektj1#
这个
java.util.Date
对象不是像现代日期时间类型那样的实时日期时间对象;相反,它表示自称为“epoch”的标准基准时间以来的毫秒数,即January 1, 1970, 00:00:00 GMT
(或utc)。打印对象时java.util.Date
,其toString
方法返回jvm时区中的日期时间,该值是从该毫秒值计算出来的。如果需要在不同的时区打印日期时间,则需要将时区设置为SimpleDateFormat
并从中获取格式化字符串。注意,api的日期时间
java.util
以及它们的格式化api,SimpleDateFormat
过时且容易出错。建议完全停止使用它们,并切换到现代日期时间api。出于任何原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。
如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。
使用现代日期时间api:
输出:
一
Instant
表示时间线上的瞬时点。一
ZonedDateTime
保持相当于三个独立对象的状态LocalDateTime
,一个ZoneId
解决了这个问题ZoneOffset
. 函数,ZonedDateTime#withZoneSameInstant
返回具有不同时区的此日期时间的副本,保留即时消息。下面是java se 8日期时间类型的概述:
从trail:date-time了解有关现代日期时间api的更多信息。
jdzmm42g2#
java.time文件
避免混淆使用
ZonedDateTime
从java.time,现代java日期和时间api,为您的日期和时区时间。试一试:
输出为:
2021-01-10t10:30:00z
一
ZonedDateTime
是时区中的日期和时间。所以你只需要这一个字段,而不是两个字段,appointmentStartDatetime
以及timezone
. 一Instant
是一个独立于时区的时间点。它以utc格式打印,用尾随字符表示Z
上面的输出。以及从ZonedDateTime
至Instant
是一个简单的方法调用。链接
oracle教程:date time解释如何使用java.time。