英文:
How to set EET for Date in Java?
问题
String value = "20220307150417";
DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = formatter.parse(value);
System.out.println(date.toString()); // 输出: Mon Mar 07 15:04:17 EET 2022
英文:
I have a code that converts String
to Date
in Java like this:
String value = "20220307150417";
DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = formatter.parse(value);
System.out.println(date.toString());
But the output is this: Mon Mar 07 15:04:17 EEST 2022
How can I change this to EET? So I want the response to be Mon Mar 07 15:04:17 EET 2022
.
答案1
得分: 3
以下是您要翻译的内容:
"You can parse your String
to a LocalDateTime
(only date and time of day, NO zone and NO offset from UTC / GMT).
If you apply a specific zone afterwards, you can build a ZonedDateTime
, which can be formatted as desired.
A ZonedDateTime
can be converted to an Instant
, and that is an option for legacy compatibility, because there are Date.from(Instant)
and Date.toInstant()
.
Here's an example with different outputs
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);
}
Please note that Date.toString()
takes the system locale and time zone into account, obviously not knowing about daylight saving time.
This took my Locale
…
Output
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
Please note that both, Instant.toEpochMilli()
and Date.getTime()
, have the same value of epoch millis!
Why ZoneId.of("Europe/Kaliningrad")
?
Because the requirement seems to be to always use EET. That means you have to choose a zone id that
- is in / uses EET
- does not apply daylight saving time
英文:
You can parse your String
to a LocalDateTime
(only date and time of day, NO zone and NO offset from UTC / GMT).
If you apply a specific zone afterwards, you can build a ZonedDateTime
, which can be formatted as desired.
A ZonedDateTime
can be converted to an Instant
, and that is an option for legacy compatibility, because there are Date.from(Instant)
and Date.toInstant()
.
Here's an example with different outputs
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);
}
Please note that Date.toString()
takes the system locale and time zone into account, obviously not knowing about daylight saving time.
This took my Locale
…
Output
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
Please note that both, Instant.toEpochMilli()
and Date.getTime()
, have the same value of epoch millis!
Why ZoneId.of("Europe/Kaliningrad")
?
Because the requirement seems to be to always use EET. That means you have to choose a zone id that
- is in / uses EET
- does not apply daylight saving time
答案2
得分: 0
Both SimpleDateFormat
and Date
classes are outdated (pun intended). That model of representing dates is badly flawed and even before java came up with a replacement there were other libraries that provided better solutions. However, By now you must use java.time
package. In your case look up the classes DateTimeFormatter and ZonedDateTime. Read about the package java.time as well. <br><br>Also you might find this relevant: I once had a project where I had to parse a string that may fit any possible format to Date without knowing the format. So, I came up with idea that I stored all supported formats in a property file and tried to parse the String with all those formats one by one until success or until all formats failed. Interesting to note that in this case the order of listing formats may be important as well since date like 02-03-2022 may be parsed as March 2d or Feb 3d depending on US or European style. In any case I wrote an article about this idea which may be relevant here: Java 8 java.time package: parsing any string to date
英文:
Both SimpleDateFormat
and Date
classes are outdated (pun intended). That model of representing dates is badly flawed and even before java came up with a replacement there were other libraries that provided better solutions. However, By now you must use java.time
package. In your case look up the classes DateTimeFormatter and ZonedDateTime. Read about the package java.time as well. <br><br>Also you might find this relevant:
I once had a project where I had to parse a string that may fit any possible format to Date without knowing the format. So, I came up with idea that I stored all supported formats in a property file and tried to parse the String with all those formats one by one until success or until all formats failed. Interesting to note that in this case the order of listing formats may be important as well since date like 02-03-2022 may be parsed as March 2d or Feb 3d depending on US or European style. In any case I wrote an article about this idea which may be relevant here: Java 8 java.time package: parsing any string to date
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论