How to print the current time and date in ISO date format in java?

限于喜欢 提交于 2019-12-07 09:00:42

问题


I am supposed to send the current date and time in ISO format as given below:

'2018-02-09T13:30:00.000-05:00'

I have written the following code:

Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm");
SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.000'Z'");
System.out.println(formatter.format(date));
System.out.println(formatter1.format(date));

It prints in the following way:

2018-04-30T12:02
2018-04-30T12:02:58.000Z

But it is not printing as the format mentioned above. How can I get the -5:00 as shown in the format and what does it indicate?


回答1:


In java 8 you can use the new java.time api:

OffsetDateTime now = OffsetDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
System.out.println(formatter.format(now)); // e.g. 2018-04-30T08:43:41.4746758+02:00

The above uses the standard ISO data time formatter. You can also truncate to milliseconds with:

OffsetDateTime now = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS);

Which yields something like (only 3 digits after the dot):

2018-04-30T08:54:54.238+02:00



回答2:


Easy solution:

    System.out.println(OffsetDateTime.now(ZoneId.of("America/Panama")).toString());

Just now I got this output:

2018-04-30T02:12:46.442185-05:00

To control that seconds are always printed with exactly three decimals:

    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXXX");
    OffsetDateTime now = OffsetDateTime.now(ZoneId.of("America/Panama"));
    System.out.println(now.format(formatter));

2018-04-30T02:12:46.442-05:00

The first, the easy version will print enough groups of three decimals to render the full precision. It will also leave out the seconds completely if they happen to be 0.0. Both are probably OK because all of this is allowed within the ISO 8601 format that you asked for. So whoever receives the string should be happy anyway.

Please fill in your desired time zone where I used America/Panama. It’s best to give explicit time zone for predictable output.

I am using and recommending java.time, the modern Java date and time API. The SimpleDateFormat that you used is not only long outdated, it is also notoriously troublesome. java.time is so much nicer to work with.

What does -05:00 indicate?

-05:00 is an offset from UTC (or GMT, it is nearly the same thing). So your example string is probably from eastern time zone in North America or some other place in Central or Southern America (Cuba, Bolivia, to mention a few that use this offset for some of the year). More precisely -05:00 means that we’re using a clock that is 5 hours (and 0 minutes) behind UTC. So 2:12:46-05:00 denotes the same point in time as 7:12:46 UTC. If we only knew the time was 2:12:46 and didn’t know a time zone or offset, it would be very ambiguous. An offset is perfect for turning the time into an unambiguous point in time.

Links

  • Oracle tutorial: Date Time explaining how to use java.time.
  • Wikipedia article: ISO 8601
  • Wikipedia article: UTC offset


来源:https://stackoverflow.com/questions/50095202/how-to-print-the-current-time-and-date-in-iso-date-format-in-java

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!