如何在Java中设置日期的EET?[副本]

nc1teljy  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(245)

此问题已在此处有答案

Convert date string (EST) to Java Date (UTC)(2个答案)
TimeZone Date Conversion [Convert a Date object to a specified timeZone Date Object](1个答案)
How do i get a date object for a specific timezone from a string date in Java? [duplicate](3个答案)
2小时前关闭
我有一段代码,可以在Java中将String转换为Date,如下所示:

String value = "20220307150417";
DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = formatter.parse(value);
System.out.println(date.toString());

但输出是这样的:Mon Mar 07 15:04:17 EEST 2022
如何将此更改为EET?所以我想得到的答案是Mon Mar 07 15:04:17 EET 2022

xriantvc

xriantvc1#

您可以将String解析为LocalDateTime(只有日期和时间,NO zone和UTC / GMT的NO偏移量)。
如果您在之后应用了一个特定的区域,您可以构建一个ZonedDateTime,它可以根据需要进行格式化。
ZonedDateTime可以转换为Instant,这是传统兼容性的一个选项,因为有Date.from(Instant)Date.toInstant()

这里是一个不同输出的示例
public static void main(String[] args) {
    // example input
    String value = "20230607121201";
    // create a formatter for parsing the String
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuuMMddHHmmss");
    // parse the String to a 
    LocalDateTime localDateTime = LocalDateTime.parse(value, dtf);
    // create the desired zone id
    ZoneId zoneId = ZoneId.of("Europe/Kaliningrad");
    // compose the LocalDateTime and the ZoneId
    ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zoneId);
    // create a formatter with the same format as Date.toString()
    DateTimeFormatter dtfOut = DateTimeFormatter.ofPattern(
                                "EEE MMM dd HH:mm:ss z uuuu",
                                Locale.ENGLISH);
    // get the Instant
    Instant instant = zonedDateTime.toInstant();
    // create a Date from the Instant
    Date date = Date.from(instant);
    // print the different representations
    System.out.println("ZonedDateTime.format(): " + zonedDateTime.format(dtfOut));
    System.out.println("Instant.toEpochMilli(): " + instant.toEpochMilli());
    System.out.println("Date.getTime():         " + date.getTime());
    System.out.println("Date.toString():        " + date);
}

请注意,Date.toString()考虑了系统的区域设置和时区,显然不知道夏令时。
这把我的Locale

输出
ZonedDateTime.format(): Wed Jun 07 12:12:01 EET 2023
Instant.toEpochMilli(): 1686132721000
Date.getTime():         1686132721000
Date.toString():        Wed Jun 07 12:12:01 CEST 2023

请注意,Instant.toEpochMilli()Date.getTime()具有相同的历元米利斯值!

为什么是ZoneId.of("Europe/Kaliningrad")

因为要求似乎总是使用EET。这意味着您必须选择一个

  • 使用EET
  • 不应用夏令时
mec1mxoz

mec1mxoz2#

SimpleDateFormatDate类都过时了(双关语)。这种表示日期的模型存在严重缺陷,甚至在java提出替代方案之前,就有其他库提供了更好的解决方案。但是,到目前为止,您必须使用java.time包。在本例中,查找类DateTimeFormatterZonedDateTime。还可以阅读有关java.time包的信息。
你可能也会发现这一点相关:我曾经有一个项目,我必须解析一个字符串,它可能适合任何可能的格式到日期,而不知道格式。因此,我想出了一个主意,我将所有支持的格式存储在一个属性文件中,并尝试逐个解析所有这些格式的String,直到成功或所有格式都失败。值得注意的是,在这种情况下,列表格式的顺序也可能很重要,因为像02-03-2022这样的日期可能会被解析为3月2日或2月3日,这取决于美国或欧洲的风格。在任何情况下,我写了一篇关于这个想法的文章,可能与此相关:Java 8 java.time package: parsing any string to date

相关问题