如何修改 UTC 日期时间到日期的小数部分 [重复]

How to modify decimal fractions from UTC Date Time to Date [duplicate]

提问人:Scripta14 提问时间:6/23/2020 更新时间:6/24/2020 访问量:1436

问:

我正在尝试将 UTC 日期时间转换为本地日期时间,但我的小数部分有一些问题。 我称 Web 服务为返回一系列数据。其中一个数据是此格式的 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));

但从我的代码来看,它确实不能很好地工作,因为返回这个日期

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 dateTime,或者通过删除多余的小数点来更改 utc dateTime。对于最后一种情况,如果这可能是一个好主意,我不是。

java 三tenbp

评论

2赞 Smile 6/23/2020
SimpleDateFormat 不支持微秒或纳秒。它仅支持毫秒,即秒后最多 3 位小数。查看 stackoverflow.com/a/62037652/1776132
0赞 Anonymous 6/24/2020
我建议你不要使用和.这些课程设计得很差,早已过时,前者尤其麻烦。请改用 java.time,即现代 Java 日期和时间 API。此外,切勿在格式模式字符串中硬编码为文本。它是偏移量(与UTC的0相比),需要这样解析。SimpleDateFormatDateInstantZ
0赞 Anonymous 6/24/2020
也不要依赖三个字母的时区缩写。虽然 UTC 可能是明确无误的,但许多都是模棱两可的,包括 ECT,它可能适用于欧洲中部时间(通常是 CET)或厄瓜多尔时间。

答:

3赞 assylias 6/23/2020 #1

您的输入格式是标准的,因此您可以简单地将其解析为 Instant,例如:

String input = "2020-06-22T18:28:57.957535800Z";
Instant date = Instant.parse(input);

如果要删除最后 3 位小数(即仅将结果保持在微秒精度),则可以截断结果:

Instant truncated = date.truncatedTo(ChronoUnit.MICROS);

另请注意,您在示例中使用的类(DateFormat、Date 等)不是 threeten 的一部分。

0赞 deHaar 6/23/2020 #2

这是一种与您的方法类似的方法,但仅使用 from 的类,而不是将其与 :org.threeten.bpjava.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