Ranco
Ranco

Reputation: 893

Show ISO-8601 date+time in current time?

for example, 2012-10-30T22:30:00+0300 need to be shown in 2012-10-30T22:30:00-0600 (the local time for example) need to implement in java (android app) how can I manage doing that?

Upvotes: 1

Views: 842

Answers (3)

Basil Bourque
Basil Bourque

Reputation: 338795

tl;dr

OffsetDateTime
.parse( 
    "2012-10-30T22:30:00+0300" , 
    DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssX" )
)
.toInstant()
.atZone(
    ZoneId.of( "Europe/London" ) 
)
.toString()

2012-10-30T19:30Z[Europe/London]

java.time

The modern solution uses the java.time classes.

Define a formatter to match your input.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssX" ) ;

Parse the input as a OffsetDateTime.

String input = "2012-11-05T13:00:00+0200" ;
OffsetDateTime odt = OffsetDateTime.parse( input , f );

odt.toString(): 2012-11-05T13:00+02:00

Tip: Always include the COLON character as a delimiter between the hours and minutes of the offset. We could then skip the custom formatting pattern: OffsetDateTime.parse( "2012-11-05T13:00+02:00" ).

Adjust to UTC, an offset of zero hours-minutes-seconds, by extracting a Instant object.

Instant instant = odt.toInstant() ;

In standard ISO 8601 format, the Z on the end means UTC (offset of zero). Pronounced “Zulu”.

instant.toString(): 2012-11-05T11:00:00Z

Adjust into London time.

ZoneId zLondon = ZoneId.of( "Europe/London" ) ;
ZonedDateTime zdtLondon = instant.atZone( zLondon ) ;

zdtLondon.toString(): 2012-11-05T11:00Z[Europe/London]

Adjust to another time zone.

ZoneId zMontreal = ZoneId.of( "America/Montreal" );
ZonedDateTime zdtMontreal = instant.atZone( zMontreal );

zdtMontreal.toString(): 2012-11-05T06:00-05:00[America/Montreal]

All these objects (odt, instant, zdtLondon, and zdtMontreal) represent the very same simultaneous moment, the same point on the timeline. Same moment, different wall-clock time.


Table of all date-time types in Java, both modern and legacy


About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for java.sql.* classes. Hibernate 5 & JPA 2.2 support java.time.

Where to obtain the java.time classes?

https://i.sstatic.net/eKgbN.png Table of which java.time library to use with which version of Java or Android

The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

Upvotes: 1

Ranco
Ranco

Reputation: 893

Using joda time library solved my problem optimally, using dateTime & dateTime zone like following:

DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis();
    DateTime dt = new DateTime();
    DateTime dt2 = new DateTime();
    dt = DateTime.parse("2012-11-05T13:00:00+0200");
    System.out.println(dt.toString());

    dt2 = DateTime.parse("2012-11-05T21:45:00-08:00");
    DateTimeZone dtz = dt2.getZone();
    System.out.println(dt.withZone(dtz).toString());

Upvotes: 0

JB Nizet
JB Nizet

Reputation: 691785

That's what a Date is: a universal instant in time. Choose the appropriate time zone when displaying it, and you'll have the time string you want:

Date now = new Date();
DateFormat df = df.getDateTimeInstance();
System.out.println(df.format(now)); // now, displayed in the current time zone (examle: Germany)
df.setTimeZone(theLondonTimeZone);
System.out.println(df.format(now)); // now, displayed in the time zone of London

Upvotes: 1

Related Questions