Java util dateformat milliseconds for some time zones do not seem correct

From what I understand, java.util.Date stores the date in milliseconds from January 1, 1970, 00:00 ...

So, I tried this code below:

public void testDateFormatBehavior()
{
    DateFormat dfNoDay = new SimpleDateFormat(
            "MMM d H:m:s zzz yyyy"
            );
    // This one should be correct as IST = GMT+5.30
    String expStrDateBegIST1 = "Jan 01 05:30:01 IST 1970";
    // Instead, this one seems to do the conversion to
    // Jan 01 00:00:00 GMT 1970
    String expStrDateBegIST2 = "Jan 01 02:00:01 IST 1970";
    String expStrDateBegUTC = "Jan 01 00:00:01 GMT 1970";
    String expStrDateBegCET = "Jan 01 01:00:00 CET 1970";
    // Should convert to Jan 01 06:00:00 GMT 1970 as CST = GMT-6
    String expStrDateBegCST = "Jan 01 00:00:00 CST 1970"; 
    // This is EST, which is GMT+6... 
    String expStrDateBegEST = "Jan 01 10:00:00 EST 1970"; 
    try {
        Date dBegIST1 = dfNoDay.parse(expStrDateBegIST1);
        Date dBegIST2 = dfNoDay.parse(expStrDateBegIST2);
        Date dBegUTC = dfNoDay.parse(expStrDateBegUTC);
        Date dBegCET = dfNoDay.parse(expStrDateBegCET);
        Date dBegCST = dfNoDay.parse(expStrDateBegCST);
        Date dBegEST = dfNoDay.parse(expStrDateBegEST);
        System.out.println("IST1 milliseconds: " + dBegIST1.getTime());
        System.out.println("IST2 milliseconds: " + dBegIST2.getTime());
        System.out.println("UTC milliseconds: " + dBegUTC.getTime());
        System.out.println("CET milliseconds: " + dBegCET.getTime());
        System.out.println("CST milliseconds: " + dBegCST.getTime());
        System.out.println("EST milliseconds: " + dBegEST.getTime());
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Exit:

IST1 milliseconds: 12601000
IST2 milliseconds: 1000
UTC milliseconds: 1000
CET milliseconds: 0
CST milliseconds: 21600000
EST milliseconds: 0

The UTC millisecond interval is correct, as we indicated 00:00:01 seconds from January 1, 1970. CET is right. CST is correct since this number of milliseconds is 6 hours after January 1, 1970.

However, the IST conversion is strange.

http://wwp.greenwichmeantime.com/to/ist/to-gmt/index.htm

IST seems to be GMT + 5:30. In my Java code, he considers it GMT + 2:00 instead.

, EST . , EST - GMT + 10: 00, GMT ​​+ 6: 00. GMT + 10: 00 - AEST, EST. http://wwp.greenwichmeantime.com/time-zone/australia/time-zones/eastern-standard-time/

-, ?

+4
2

Timezone javadoc :

JDK 1.1.x ( "PST", "CTT", "AST" ). , , (, "CST" " " " " ) Java .


, , .

"IST" : / / . , "EST" .


Joda-time . Joda-time java.util Olson .

Java , ​​ Joda Time? , Joda-time.

+5

TL;DR

ZonedDateTime.parse(   // Parse string as `ZonedDateTime` object.
    "1969-12-31T19:00-05:00[America/New_York]"   // This zone on that date is five hours behind UTC. 
)                      // So last day of 1969 at 7 PM there is simultaneously first moment of January 1, 1970 in UTC (00:00:00).
.toInstant()           // .toString() --> 1970-01-01T00:00:00Z
.toEpochMilli()        // --> zero seconds since epoch, as we are *at* the epoch.

0

Samuel .

java.time, , Date.

continent/region, America/Montreal, Africa/Casablanca Pacific/Auckland. 3-4 , EST IST, , (!).

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;  

ISO 8601

ISO 8601 .

java.time ISO 8601 / . .

ZonedDateTime , .

String input = "1970-01-01T05:30:01+05:30[Asia/Kolkata]" ;  // "Jan 01 05:30:01 IST 1970"
ZonedDateTime zdt = ZonedDateTime.parse( input ) ;
String output = zdt.toString() ;  // Generate string in standard ISO 8601 format.

1970-01-01T05: 30: 01 + 05: 30 [/]

UTC, Instant. UTC, UTC.

Instant instant = zdt.toInstant() ;

instant.toString(): 1970-01-01T00: 00: 01Z

--, . , 1970 UTC (1970-01-01T00: 00: 00Z).

(1 ).

long millisSinceEpoch = instant.toEpochMilli() ;

1000

:

String input = "1970-01-01T10:00:00-05:00[America/New_York]";  // "Jan 01 10:00:00 EST 1970"
ZoneId z = ZoneId.of( "America/New_York" );
ZonedDateTime zdt = ZonedDateTime.parse( input );
Instant instant = zdt.toInstant();
long millisSinceEpoch = instant.toEpochMilli();

zdt.toString(): 1970-01-01T10: 00-05: 00 [America/New_York]

instant.toString(): 1970-01-01T15: 00: 00Z

millisSinceEpoch: 54000000

. 7 . America/New_York UTC. , UTC, , , 1970-01-01T00: 00: 00Z. , 1969-12-31T19:00-05:00[America/New_York] .

String input = "1969-12-31T19:00-05:00[America/New_York]" ;
ZoneId z = ZoneId.of( "America/New_York" );
ZonedDateTime zdt = ZonedDateTime.parse( input );
Instant instant = zdt.toInstant();
long millisSinceEpoch = instant.toEpochMilli();

zdt.toString(): 1969-12-31T19: 00-05: 00 [America/New_York]

instant.toString(): 1970-01-01T00: 00: 00Z

millisSinceEpoch: 0


java.time

java.time Java 8 . legacy , java.util.Date, Calendar SimpleDateFormat.

Joda-Time, , java.time.

, . Oracle. Qaru . JSR 310.

JDBC-, JDBC 4.2 java.time- . java.sql. * Classes.

java.time?

ThreeTen-Extra java.time . java.time. , Interval, YearWeek, YearQuarter .

0

All Articles