Java Programmer
Java Programmer

Reputation: 1413

ISO datetime with timezone issue

I am just printing the ISO datetime with timezone as per the below documentation http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a003169814.htm

This is my code

TimeZone tz = TimeZone.getTimeZone("UTC");
        DateFormat df = new SimpleDateFormat("yyyy-mm-dd'T'hh:mm:ss.nnnnnn+|-hh:mm"); 
        df.setTimeZone(tz);
        dateTimeWithTimeZone = df.format(new Date());

However i am getting this exception
Illegal pattern character 'n' I cant use this format directly in Java ?

Upvotes: 1

Views: 168

Answers (1)

Anonymous
Anonymous

Reputation: 86389

java.time

    dateTimeWithTimeZone = Instant.now().toString();
    System.out.println(dateTimeWithTimeZone);

When I ran this snippet just now, I got this output:

2019-03-18T22:28:13.549319Z

It’s not clear from the page you link to, but it’s an ISO 8601 string in UTC, so should be all that you need. I am taking advantage of the fact that the classes of java.time produce ISO 8601 output from their toString methods. The linked page does show the format with hyphens, T and colons (2008-09-15T15:53:00+05:00), it shows another example with decimals on the seconds (15:53:00.322348) and a third one with Z meaning UTC (20080915T155300Z), so I would expect that the combination of all three of these would be OK too.

The format you used in the quesiton seems to try to get the offset as +00:00 rather than Z. If this is a requirement, it’s only a little bit more complicated. We are using an explicit formatter to control the variations within ISO 8601:

        DateTimeFormatter iso8601Formatter
                = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSSxxx");
        dateTimeWithTimeZone = OffsetDateTime.now(ZoneOffset.UTC).format(iso8601Formatter);
        System.out.println(dateTimeWithTimeZone);

2019-03-18T22:28:13.729711+00:00

What went wrong in your code?

You tried to use the formatting symbols from your source with SimpleDateFormat. First, you should never, and especially not in Java 8 or later, want to use SimpleDateFormat. That class is notoriously troublesome and long outdated. Second, some of its format pattern letters agree with the symbols from your source, some of them don’t, so you cannot just use the symvol string from there. Instead you need to read the documentation and find the correct format pattern letters to use for year, month, etc. And be aware that they are case sensitive: MM and mm are different.

Link

Oracle Tutorial: Date Time explaining how to use java.time.

Upvotes: 2

Related Questions