samba
samba

Reputation: 3101

Scala - How to convert LocalDateTime to ZonedDateTime formatted without GMT postfix?

I wanted to get the LocalDateTime in GMT so wrapped it with ZonedDateTime.

But gmtZoneTime is returned in the following format: 2019-10-29T00:00Z[GMT] While I need it to be: 2019-10-29T00:00:00.000+0000

How should I properly convert localDateTime into the GMT ZonedDateTime?

val currentDate:LocalDate = java.time.LocalDate.now
val localDateTime: LocalDateTime = currentDate.atStartOfDay
val gmtZoneTime: ZonedDateTime = localDateTime.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("GMT"))

Upvotes: 1

Views: 2407

Answers (2)

Anonymous
Anonymous

Reputation: 86314

First your code is incorrect. When I ran it in my time zone (Europe/Copenhagen) just now, I got

2019-10-29T23:00Z[GMT]

I don’t think you intended 23:00 in GMT.

Second you may think of GMT or UTC as an offset (of zero from UTC), so it is more correct to use an OffsetDateTIme than a ZonedDateTime for the time. This also eliminates your unwanted suffix. In Java (it’s all I can write):

    LocalDate currentDate = LocalDate.now(ZoneOffset.UTC);
    OffsetDateTime gmtZoneTime = currentDate.atStartOfDay(ZoneOffset.UTC)
            .toOffsetDateTime();
    System.out.println(gmtZoneTime);

Output when running just now:

2019-10-30T00:00Z

Edit: You can safely regard UTC and GMT as synonymous since java.time does that (even though strictly speaking they may differ by up to a second).

I assumed you also wanted the date in UTC, so passed this as argument to LocalDate.now(). If you want the date in some other time zone, pass that time zone to LocalDate.now() so that it is clear from the code what you get.

If you want that specific format in your question, pezetem is correct in the other answer that you need to format into a string:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxx");
    String formattedGmtTime = gmtZoneTime.format(formatter);
    System.out.println(formattedGmtTime);

2019-10-30T00:00:00.000+0000

It seems wordy to me, though. I’d at least leave out the milliseconds since we know they are 0, probably the seconds too. Said without knowing your exact business case.

Link: Difference between UTC and GMT

Upvotes: 1

pezetem
pezetem

Reputation: 2541

You need to format the ZonedDateTime.

First approach would be to use predefined formatter like: java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME, however for GMT it shows 'Z' instead of '+0000' (default behaviour, other offsets are displayed like '+0100' etc.)

So the second one would be to create your own formatter like: java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")

and then use it to format ZonedDateTime like gmtZoneTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")) so you get a result like:

2019-10-28T23:00:00+0000

Upvotes: 2

Related Questions