3
String s = 19.17.38.008000;
DateFormat f = new SimpleDateFormat("HH.mm.ss.SSSSSS");
Date d = f.parse(s);
system.out.println(d);

这是我正在运行的代码,它运行良好,除非它打印时打印时间 19:17:46。请有人向我解释一下

作为旁注:

String s = 19.17.38.008000;
DateFormat f = new SimpleDateFormat("HH.mm.ss");
Date d = f.parse(s);
system.out.println(d);

此代码将正确打印相同的字符串减去毫秒。有人请告诉我我在这里缺少什么。

编辑:感谢您的回答,我认为这里的问题是我将 38.008000 读取为 0.008 秒,但 sdf 将 SSS 读取为 8000 毫秒,这不是一回事。

4

3 回答 3

5

该类SimpleDateFormat解释008000为 8000 毫秒或 8 秒,并将其添加到已解释的 38 秒中。

如果我们有这个:

String s = "19.17.38.009000";

然后我们会得到这个输出,加上 9 秒:

Thu Jan 01 19:17:47 PST 1970

从字符串末尾删除 3 个额外的零。如果有 6 位数字,那么它们看起来应该代表微秒(百万分之一秒),而不是毫秒(千分之一秒)。

String s = "19.17.38.008";

输出:

Thu Jan 01 19:17:38 PST 1970
于 2014-04-24T20:58:51.233 回答
3

SSSSSS即使你放了 6 个,仍然是毫秒。19:17:38 + 008000 ms 是 19:17:46 所以它是正确的,如果令人惊讶的话。

AFAIK java.timeJava 8 中的库支持微秒(和纳秒)时间戳。

感谢@Meno 的更正。

于 2014-04-24T20:59:05.317 回答
0

SimpleDateFormat 不解析超过毫秒精度另外,请查看文档中的以下描述(强调我的):

从给定字符串的开头解析文本以生成日期。 该方法可能不会使用给定字符串的整个文本

因此,即使您的模式有六个S,也SimpleDateFormat只使用前三个,即

HH.mm.ss.SSS

换句话说,对于您的字符串,SimpleDateFormat无论您使用HH.mm.ss.SSS或,都会给您同样的错误结果HH.mm.ss.SSSSSSSimpleDateFormat充满了很多这样的惊喜。为了在使用时解决问题SimpleDateFormat,您需要0从字符串末尾删除三个 s,即如果您解析19.17.38.008SimpleDateFormat将给出您想要的结果。

因此,旧的日期时间 API(java.util日期时间类型及其格式化 API SimpleDateFormat)不仅过时而且容易出错。建议完全停止使用它们并切换到java.time现代日期时间 API *

使用现代日期时间 API 的演示:

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        String s = "19.17.38.008000";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH.mm.ss.SSSSSS", Locale.ENGLISH);
        LocalTime time = LocalTime.parse(s, dtf);
        System.out.println(time);
    }
}

输出:

19:17:38.008

请注意,如果您尝试将HH.mm.ss.SSS, 与java.timeAPI 一起用于您的字符串,它会抛出一个异常,提醒您有问题,同时SimpleDateFormat默默地解析您的字符串,从而给您带来不希望的结果。

Trail: Date Time了解有关现代日期时间 API *的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-05-01T13:50:14.357 回答