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

问题描述

我在 Java 上的 API 中使用日期。我想获取今天的日期和时间,将其写入一个类,然后写入一个 csv 文件(我使用 csv 文件作为数据存储)。然后,实现获取今天的记录报表功能获取并与今天的日期(准确的日期,没有时间)进行比较。做这个的最好方式是什么?现在我将它存储在 Timestamp 中,但它似乎不正确,我应该使用 String 吗?那我需要两个解析器?要将字符串转换为日期和时间,然后再转换为 DATE?哪个库更适合用于此目的?

我写了一个从字符串到时间戳的翻译,正确吗?

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());
}

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

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

UPD 我根据答案@OleV.V 编辑了代码。它真的很酷

解决方法

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

该字符串采用 ISO 8601 格式,这应该是最好的,以避免任何阅读它的人感到意外。 java.time 的类通常从其 toString 方法打印 ISO 8601 格式。

通常,与知道在写入文件时使用了哪个 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") 之类的内容。重要的是:所有时区的日期永远不会相同。

如果您想知道日期是早还是晚,请使用 isBeforeisAfterLocalDate 方法。

您的代码是否正确?

恕我直言,您的代码最糟糕的问题是使用旧的且设计不佳的日期时间类:SimpleDateFormatDateTimestampSimpleDateFormat 是班级臭名昭著的麻烦制造者。 Date 在 Java 1.0 中存在严重的设计缺陷,因此大多数构造函数和方法在 Java 1.1 中已被弃用。 Timestamp 从来没有用于其他目的,只是在 SQL 数据库之间传输高精度时间戳(我们也不再使用它)。它是对已经设计得很糟糕的 Date 类的真正改进。此外,我看不到您想要使用 Timestamp 的高精度的任何东西,因此在这里使用它似乎毫无意义。

您的代码中存在一个错误:您在格式模式中使用了大写 YYYY。这是针对周年的,仅对周数有用。我尝试将 24-06-2021 用于您的方法。它返回了 2021-01-04 00:00:00.0。由于提到的错误,它有 5 个月零 20 天的假期。显然 SimpleDateFormat 默认为一周年中第 1 周的开始,而忽略了月份和月份的日期。

顺便说一句,如果您尝试使用 java.time 解析相同格式的模式字符串,它至少会告诉您这是错误的。

链接