java—从字符串转换为时间戳并返回

qeeaahzv  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(653)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

13天前关门了。
改进这个问题
我在java上使用api中的日期。我想得到今天的日期和时间,将它写入一个类,然后写入一个csv文件(我使用csv文件作为数据存储)。然后,实现获取今天的记录报告的功能,获取报告并将其与今天的日期(准确的日期,没有时间)进行比较。最好的方法是什么?现在我把它存储在timestamp中,但它似乎不正确,我应该使用string吗?那我需要两个解析器?把一个字符串翻译成一个日期和时间,然后再翻译成一个日期?哪个图书馆更适合做这个?
我写了一个从字符串到时间戳的翻译,对吗?

default Timestamp StringToTimestamp(String date) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-YYYY");
    Date parsedDate = null;
    try {
        parsedDate = dateFormat.parse(date);
    } catch (ParseException e) {
        e.printStackTrace();
        log.error("Error in date parsing");
    }
    return new Timestamp(parsedDate.getTime());
}

upd我修改了java.time库的代码,但似乎我做错了什么

default LocalDate StringToTimestamp(String date) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern('yyyy-mm-dd');
        LocalDate date = LocalDate.parse(date, dtf);
        return date;
    }

我根据答案@olev.v编辑了代码。它真的很酷

56lgkhnf

56lgkhnf1#

java.time文件

我建议您在日期和时间工作中使用java.time,即现代的java日期和时间api。我建议将当前日期和时间以及utc的偏移量写入csv文件。

OffsetDateTime dateTime = OffsetDateTime.now(ZoneId.systemDefault());
    String stringForCsvFile = dateTime.toString();
    System.out.println(stringForCsvFile);

刚才在我的时区运行时的输出:
2020-12-26t11:02:07.368973+01:00
字符串是iso8601格式的,这应该是最好的,以避免任何人阅读它的惊喜。time的类通常从它们的 toString 方法。
通常,您对一致性的重视程度高于在写入文件时知道使用了哪个utc偏移量。如果是,请将utc时间写入文件:

Instant now = Instant.now();
    String stringForCsvFile = now.toString();

2020-12-26t10:02:07.373439z
无论上面使用哪种方式,从文件中读取时间戳后,都要按以下方式转换:

ZoneId zone = ZoneId.systemDefault();
    String stringFromCsvFile = "2020-12-26T11:02:07.368973+01:00";
    ZonedDateTime dateTime = OffsetDateTime.parse(stringFromCsvFile)
            .atZoneSameInstant(zone);
    LocalDate dateFromCsv = dateTime.toLocalDate();
    LocalDate today = LocalDate.now(zone);

    System.out.println("Same day? " + dateFromCsv.isEqual(today));

同一天?是的
我已经确保我比较的两个日期都在程序运行的jvm的时区。请考虑是否有您想要的特定时区,如果有,请设置 zone 像这样的 ZoneId.of("Asia/Baku") . 重要的是:在所有的时区都不是同一个日期。
如果您想知道日期是早还是晚,请使用 isBefore 或者 isAfter 方法 LocalDate .

你的代码正确吗?

您的代码最糟糕的问题是使用了旧的、设计糟糕的日期时间类: SimpleDateFormat , Date 以及 Timestamp . SimpleDateFormat 是一个声名狼藉的捣蛋鬼。 Date 在Java1.0中有严重的设计缺陷,因此大多数构造函数和方法在Java1.1中已经被弃用了。 Timestamp 除了在sql数据库之间传输高精度时间戳(我们也不再使用它了)之外,从来没有其他用途。这是一个真正的黑客在已经糟糕的设计之上 Date 班级。此外,我看不到任何你想使用的高精度 Timestamp 因此,在这里使用它似乎毫无意义。
代码中有一个bug:您使用的是大写 YYYY 以你的格式模式。这是一年中的一周,只对周数有用。我试着给予 24-06-2021 你的方法。它回来了 2021-01-04 00:00:00.0 . 由于上述错误,5个月20天的假期。显然地 SimpleDateFormat 默认为周年的第1周开始,忽略月和月日。
另外,如果您尝试用java.time使用相同的格式模式字符串进行解析,它至少会告诉您这是错误的。

链接

oracle教程:date time解释如何使用java.time。
维基百科文章:iso 8601
相关问题:到目前为止的java解析字符串

相关问题