以UTC格式将LocalDateTime转换为LocalDateTime。
LocalDateTime convertToUtc(LocalDateTime date) {
//do conversion
}
我在网上搜索过。但没有得到解决方案
答案 0 :(得分:73)
有一种更简单的方式
LocalDateTime.now(Clock.systemUTC())
答案 1 :(得分:55)
我个人更喜欢
LocalDateTime.now(ZoneOffset.UTC);
因为它是最易读的选项。
答案 2 :(得分:36)
LocalDateTime不包含区域信息。 ZonedDatetime确实。
如果要将LocalDateTime转换为UTC,则需要按ZonedDateTime包装。
您可以像下面这样转换。
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt.toLocalTime());
ZonedDateTime ldtZoned = ldt.atZone(ZoneId.systemDefault());
ZonedDateTime utcZoned = ldtZoned.withZoneSameInstant(ZoneId.of("UTC"));
System.out.println(utcZoned.toLocalTime());
答案 3 :(得分:11)
使用以下内容。它使用本地日期时间并使用时区将其转换为UTC。你不需要创建它的功能。
ZonedDateTime nowUTC = ZonedDateTime.now(ZoneOffset.UTC);
System.out.println(nowUTC.toString());
如果您需要获取ZonedDateTime的LocalDateTime部分,那么您可以使用以下内容。
nowUTC.toLocalDateTime();
这是我在我的应用程序中使用的静态方法,用于在mysql中插入UTC时间,因为我无法将默认值 UTC_TIMESTAMP 添加到日期时间列。
public static LocalDateTime getLocalDateTimeInUTC(){
ZonedDateTime nowUTC = ZonedDateTime.now(ZoneOffset.UTC);
return nowUTC.toLocalDateTime();
}
答案 4 :(得分:9)
这里是一个简单的小实用程序类,可用于将本地日期时间从区域转换为区域,包括直接将实时方法从当前区域转换为UTC(使用main方法,以便您可以运行它并查看简单测试的结果):
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
public final class DateTimeUtil {
private DateTimeUtil() {
super();
}
public static void main(final String... args) {
final LocalDateTime now = LocalDateTime.now();
final LocalDateTime utc = DateTimeUtil.toUtc(now);
System.out.println("Now: " + now);
System.out.println("UTC: " + utc);
}
public static LocalDateTime toZone(final LocalDateTime time, final ZoneId fromZone, final ZoneId toZone) {
final ZonedDateTime zonedtime = time.atZone(fromZone);
final ZonedDateTime converted = zonedtime.withZoneSameInstant(toZone);
return converted.toLocalDateTime();
}
public static LocalDateTime toZone(final LocalDateTime time, final ZoneId toZone) {
return DateTimeUtil.toZone(time, ZoneId.systemDefault(), toZone);
}
public static LocalDateTime toUtc(final LocalDateTime time, final ZoneId fromZone) {
return DateTimeUtil.toZone(time, fromZone, ZoneOffset.UTC);
}
public static LocalDateTime toUtc(final LocalDateTime time) {
return DateTimeUtil.toUtc(time, ZoneId.systemDefault());
}
}
答案 5 :(得分:2)
tldr:根本没办法做到这一点;如果你想这样做,你会得到 LocalDateTime 错误。
原因是 LocalDateTime 在创建实例后不记录时区。您无法根据特定时区将没有时区的日期时间转换为其他日期时间。
事实上,除非您的目的是获得随机结果,否则不应在生产代码中调用 LocalDateTime.now()。当您构造一个 LocalDateTime 实例时,此实例仅包含基于当前服务器时区的日期时间,这意味着如果运行带有服务器的服务器,这段代码将生成不同的结果一个不同的时区配置。
LocalDateTime 可以简化日期计算。如果您想要一个真正普遍可用的数据时间,请使用ZonedDateTime或OffsetDateTime:https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html。
答案 6 :(得分:1)
看着答案和问题,似乎问题已被重大修改。因此,要回答当前问题:
在UTC中将LocalDateTime转换为LocalDateTime。
LocalDateTime
不会存储有关时区的任何信息,它基本上只保存年,月,日,时,分,秒和较小单位的值。因此,一个重要的问题是:原始LocalDateTime
的时区是什么?可能已经是UTC,因此不必进行转换。
考虑到仍然要问这个问题,您可能意味着原始时间在系统默认时区中,并且您想要将其转换为UTC。因为通常使用LocalDateTime
创建一个LocalDateTime.now()
对象,该对象返回系统默认时区中的当前时间。在这种情况下,转换如下:
LocalDateTime convertToUtc(LocalDateTime time) {
return time.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}
转换过程示例:
2019-02-25 11:39 // [time] original LocalDateTime without a timezone
2019-02-25 11:39 GMT+1 // [atZone] converted to ZonedDateTime (system timezone is Madrid)
2019-02-25 10:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime
2019-02-25 10:39 // [toLocalDateTime] losing the timezone information
在任何其他情况下,当您明确指定要转换的时间的时区时,转换将如下:
LocalDateTime convertToUtc(LocalDateTime time, ZoneId zone) {
return time.atZone(zone).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}
转换过程示例:
2019-02-25 11:39 // [time] original LocalDateTime without a timezone
2019-02-25 11:39 GMT+2 // [atZone] converted to ZonedDateTime (zone is Europe/Tallinn)
2019-02-25 09:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime
2019-02-25 09:39 // [toLocalDateTime] losing the timezone information
atZone()
方法 atZone()
方法的结果取决于作为其参数传递的时间,因为它考虑了时区的所有规则,包括夏时制(DST)。在示例中,时间是2月25日,在欧洲,这意味着冬天(无夏令时)。
如果我们使用其他日期,比如说从去年8月25日开始,考虑到夏令时,结果将有所不同:
2018-08-25 11:39 // [time] original LocalDateTime without a timezone
2018-08-25 11:39 GMT+3 // [atZone] converted to ZonedDateTime (zone is Europe/Tallinn)
2018-08-25 08:39 GMT // [withZoneSameInstant] converted to UTC, still as ZonedDateTime
2018-08-25 08:39 // [toLocalDateTime] losing the timezone information
GMT时间不变。因此,可以调整其他时区的偏移量。在此示例中,爱沙尼亚的夏季时间为GMT + 3,冬季时间为GMT + 2。
此外,如果您在将时钟改回一小时的过渡中指定了时间。例如。对于爱沙尼亚,2018年10月28日03:30,这可能意味着两个不同的时间:
2018-10-28 03:30 GMT+3 // summer time [UTC 2018-10-28 00:30]
2018-10-28 04:00 GMT+3 // clocks are turned back 1 hour [UTC 2018-10-28 01:00]
2018-10-28 03:00 GMT+2 // same as above [UTC 2018-10-28 01:00]
2018-10-28 03:30 GMT+2 // winter time [UTC 2018-10-28 01:30]
在不手动指定偏移量(GMT + 2或GMT + 3)的情况下,时区03:30
的时间Europe/Tallinn
可以表示两个不同的UTC时间和两个不同的偏移量。
如您所见,最终结果取决于作为参数传递的时间的时区。由于无法从LocalDateTime
对象中提取时区,因此您必须知道自己来自哪个时区才能将其转换为UTC。
答案 7 :(得分:1)
尝试使用此方法。
使用 of 方法将LocalDateTime
转换为ZonedDateTime
,并传递系统默认时区,或者您可以使用 ZoneId < / em>所在区域的ZoneId.of("Australia/Sydney");
LocalDateTime convertToUtc(LocalDateTime dateTime) {
ZonedDateTime dateTimeInMyZone = ZonedDateTime.
of(dateTime, ZoneId.systemDefault());
return dateTimeInMyZone
.withZoneSameInstant(ZoneOffset.UTC)
.toLocalDateTime();
}
要转换回您所在区域的本地日期时间,请使用:
LocalDateTime convertFromUtc(LocalDateTime utcDateTime){
return ZonedDateTime.
of(utcDateTime, ZoneId.of("UTC"))
.toOffsetDateTime()
.atZoneSameInstant(ZoneId.systemDefault())
.toLocalDateTime();
}
答案 8 :(得分:-1)
public static String convertFromGmtToLocal(String gmtDtStr, String dtFormat, TimeZone lclTimeZone) throws Exception{
if (gmtDtStr == null || gmtDtStr.trim().equals("")) return null;
SimpleDateFormat format = new SimpleDateFormat(dtFormat);
format.setTimeZone(getGMTTimeZone());
Date dt = format.parse(gmtDtStr);
format.setTimeZone(lclTimeZone);
return
format.format(DT); }
答案 9 :(得分:-1)
你可以实现这样的帮助:
public static LocalDateTime convertUTCFRtoUTCZ(LocalDateTime dateTime) {
ZoneId fr = ZoneId.of("Europe/Paris");
ZoneId utcZ = ZoneId.of("Z");
ZonedDateTime frZonedTime = ZonedDateTime.of(dateTime, fr);
ZonedDateTime utcZonedTime = frZonedTime.withZoneSameInstant(utcZ);
return utcZonedTime.toLocalDateTime();
}