如何解决从字符串转换为时间戳并返回
我在 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")
之类的内容。重要的是:所有时区的日期永远不会相同。
如果您想知道日期是早还是晚,请使用 isBefore
的 isAfter
或 LocalDate
方法。
您的代码是否正确?
恕我直言,您的代码最糟糕的问题是使用旧的且设计不佳的日期时间类:SimpleDateFormat
、Date
和 Timestamp
。 SimpleDateFormat
是班级臭名昭著的麻烦制造者。 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 解析相同格式的模式字符串,它至少会告诉您这是错误的。
链接
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。