如何将小数部分从 UTC 日期时间修改为日期
How to modify decimal fractions from UTC Date Time to Date
我正在尝试将 utc 日期时间转换为本地日期时间,但我在小数部分方面遇到了一些问题。
我将 Web 服务称为 return 一系列数据。这些数据之一是这种格式的 utc 日期时间
我必须使用这个库 org.threeten.bp,我不能使用其他库。
2020-06-22T18:28:57.957535800Z
为了将 utcFormat 转换为 Date,我发现这段代码工作正常
DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = utcFormat.parse("2012-08-15T22:56:02.038Z");
DateFormat pstFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
pstFormat.setTimeZone(TimeZone.getTimeZone("ECT"));
System.out.println(pstFormat.format(date));
但它在我的代码中效果不佳,因为return这个日期
2020-07-03T22:27:52.800
你怎么能看出它的不同。我做了一些测试,如果我在点后只保留 3 位小数,那部分代码就可以正常工作。看例子:
2020-06-22T18:28:57.800Z
return the right date time from ECT zone
2020-06-22T20:28:57.800
我正在寻找一种方法来接收只有三位小数的 utc 日期时间或通过删除多余的小数来更改 utc 日期时间。对于最后一个案例,我不是一个好主意。
您的输入格式是标准的,因此您可以简单地将其解析为 Instant
,例如:
String input = "2020-06-22T18:28:57.957535800Z";
Instant date = Instant.parse(input);
如果您想去除最后 3 位小数(即只将结果保持在 microsecond 精度),您可以截断结果:
Instant truncated = date.truncatedTo(ChronoUnit.MICROS);
另请注意,您在示例中使用的 类(DateFormat、Date 等)不属于 threeten。
这是一种与您的方法类似的方法,但仅使用 org.threeten.bp
中的 类,而不是将其与 java.util
混合使用:
public static void main(String[] args) throws ParseException {
String datetimeUtc = "2020-06-22T18:28:57.957535800Z";
// parse it to a ZonedDateTime, this is default formatting ==> no formatter needed
ZonedDateTime utcTime = ZonedDateTime.parse(datetimeUtc);
// print the result
System.out.println(utcTime);
// convert it to another zone
ZonedDateTime estTime = utcTime.withZoneSameInstant(ZoneId.of("Europe/Paris"));
// print that, too
System.out.println(estTime);
// define a non-default output format
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
// and print the estTime using that format
System.out.println(estTime.format(dtf));
}
这会输出以下内容:
2020-06-22T18:28:57.957535800Z
2020-06-22T20:28:57.957535800+02:00[Europe/Paris]
2020-06-22T20:28:57.957
我正在尝试将 utc 日期时间转换为本地日期时间,但我在小数部分方面遇到了一些问题。 我将 Web 服务称为 return 一系列数据。这些数据之一是这种格式的 utc 日期时间 我必须使用这个库 org.threeten.bp,我不能使用其他库。
2020-06-22T18:28:57.957535800Z
为了将 utcFormat 转换为 Date,我发现这段代码工作正常
DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = utcFormat.parse("2012-08-15T22:56:02.038Z");
DateFormat pstFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
pstFormat.setTimeZone(TimeZone.getTimeZone("ECT"));
System.out.println(pstFormat.format(date));
但它在我的代码中效果不佳,因为return这个日期
2020-07-03T22:27:52.800
你怎么能看出它的不同。我做了一些测试,如果我在点后只保留 3 位小数,那部分代码就可以正常工作。看例子:
2020-06-22T18:28:57.800Z
return the right date time from ECT zone
2020-06-22T20:28:57.800
我正在寻找一种方法来接收只有三位小数的 utc 日期时间或通过删除多余的小数来更改 utc 日期时间。对于最后一个案例,我不是一个好主意。
您的输入格式是标准的,因此您可以简单地将其解析为 Instant
,例如:
String input = "2020-06-22T18:28:57.957535800Z";
Instant date = Instant.parse(input);
如果您想去除最后 3 位小数(即只将结果保持在 microsecond 精度),您可以截断结果:
Instant truncated = date.truncatedTo(ChronoUnit.MICROS);
另请注意,您在示例中使用的 类(DateFormat、Date 等)不属于 threeten。
这是一种与您的方法类似的方法,但仅使用 org.threeten.bp
中的 类,而不是将其与 java.util
混合使用:
public static void main(String[] args) throws ParseException {
String datetimeUtc = "2020-06-22T18:28:57.957535800Z";
// parse it to a ZonedDateTime, this is default formatting ==> no formatter needed
ZonedDateTime utcTime = ZonedDateTime.parse(datetimeUtc);
// print the result
System.out.println(utcTime);
// convert it to another zone
ZonedDateTime estTime = utcTime.withZoneSameInstant(ZoneId.of("Europe/Paris"));
// print that, too
System.out.println(estTime);
// define a non-default output format
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
// and print the estTime using that format
System.out.println(estTime.format(dtf));
}
这会输出以下内容:
2020-06-22T18:28:57.957535800Z
2020-06-22T20:28:57.957535800+02:00[Europe/Paris]
2020-06-22T20:28:57.957