gpt4 book ai didi

java - 将带有 zoneId 的字符串 localdate 转换为 UTC 偏移日期 JAVA

转载 作者:行者123 更新时间:2023-11-30 06:46:38 24 4
gpt4 key购买 nike

我正在尝试将巴西本地日期转换为 UTC 格式。我已经开发了我的解决方案,但我确信它可以改进。我一直在寻找其他问题,但没有成功。

我的问题是,当我处理 Date 对象时:

Instant endDateTime = questionDate.toInstant();

我收到的 UTC 日期为 "2017-11-16T00:00:00Z" 但这应该是巴西本地日期(不正确,因为它有尾随 "Z"),当我尝试转换为 UTC 时,我收到相同的输出。

另一方面,如果我使用 ZoneDateTime 类并使用 LocalDateTime 对象构建日期,我会在输出中丢失秒数:"2017-11-16T02 :00Z"。当我使用时会发生这种情况:

LocalTime.of(hour, minutes, seconds);

我搜索了 LocalTime 类,我认为这是因为分钟或秒为 0 但我不确定。

解决方案的问题:

  1. 响应没秒
  2. 希望Java 8有一套功能,让这个更简单明了

前提条件:

  • 我不会使用 Joda 库
  • 结果必须是 OffsetDateTime
  • 输入:日期 "2017-11-16"
  • 输出:"2017-11-16T02:00:00Z"

这是我的解决方案:

private static OffsetDateTime processDate(Date questionDate) {
Instant endDateTime = questionDate.toInstant();
ZoneId zoneId = ZoneId.of(ZONEID);
String [] date = endDateTime.toString().split("T");
LocalDateTime localDateTime = convertLocalTimeToUtc(date);
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zoneId);
ZonedDateTime utcDate = zonedDateTime.withZoneSameInstant(ZoneOffset.UTC);
return utcDate.toOffsetDateTime();
}

private static LocalDateTime convertLocalTimeToUtc(String[] dateFromCountry) {
LocalDate date = processDate(dateFromCountry[0]);
LocalTime time = processTime(dateFromCountry[1]);
return LocalDateTime.of(date, time);
}

private static LocalDate processDate(String dateFromCountry) {
String [] partsOfDate = dateFromCountry.split("-");
int year = Integer.parseInt(partsOfDate[0]);
int month = Integer.parseInt(partsOfDate[1]);
int day = Integer.parseInt(partsOfDate[2]);
return LocalDate.of(year, month, day);
}

private static LocalTime processTime(String dateFromCountry) {
String [] partsOfTime = dateFromCountry.split(":");
int hour = Integer.parseInt(partsOfTime[0]);
int minutes = Integer.parseInt(partsOfTime[1]);
int seconds = Integer.parseInt(partsOfTime[2].substring(0,1));
return LocalTime.of(hour,minutes,seconds);
}

最佳答案

如果您的输入是 java.util.Date,您可以摆脱所有的字符串操作:

//simulate your input
Instant input = Instant.parse("2017-11-16T00:00:00Z");
Date d = Date.from(input);

//transformation code starts here
Instant instant = d.toInstant();

ZonedDateTime localInstant = instant.atZone(ZoneOffset.UTC);
ZonedDateTime sameLocalInBrazil = utcInstant.withZoneSameLocal(ZoneId.of("Brazil/East"));
OffsetDateTime sameInstantUtc = sameLocalInBrazil.toOffsetDateTime()
.withOffsetSameInstant(ZoneOffset.UTC);

如您所料,这将返回值为 2017-11-16T02:00Z 的 OffsetDateTime。

请注意,OffsetDateTime 没有格式 - 因此该对象确实知道它的秒数设置为 0,但默认的 toString 方法不会打印它们。如果你想用秒打印它,你可以使用格式化程序:

//Formatting
System.out.println(sameInstantUtc.format(DateTimeFormatter.ISO_INSTANT));

打印 2017-11-16T02:00:00Z


如果您的输入是 java.sql.Date,您可以使用稍微不同的策略:

LocalDate d = sqlDate.toLocalDate();
ZonedDateTime localInstant = d.atStartOfDay(ZoneOffset.UTC);

其余代码将相同。

关于java - 将带有 zoneId 的字符串 localdate 转换为 UTC 偏移日期 JAVA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47333739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com