Java time: starts on January 1, 1970 at 1 am?

What am I missing? Date () is the number of milliseconds that have passed since midnight, January 1, 1970. If midnight doesn't start at 0am?

Literature:

My test program:

package be.test.package.time; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; public class TimeWork { public static void main(String[] args) { List<Long> longs = new ArrayList<>(); List<String> strings = new ArrayList<>(); DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss.SSS"); //Now Date now = new Date(); strings.add(formatter.format(now)); //Test dates strings.add("01-01-1970 00:00:00.000"); strings.add("01-01-1970 01:00:00.000"); strings.add("31-11-1969 00:00:00.000"); strings.add("01-01-2014 00:00:00.000"); //Test data longs.add(-1L); longs.add(0L); longs.add(1L); longs.add(7260000L); longs.add(1417706084037L); longs.add(-7260000L); //Show the long value of the date for (String string: strings) { try { Date date = formatter.parse(string); System.out.println("Formated date : " + string + " = Long = " + date.getTime()); } catch (ParseException e) { e.printStackTrace(); } } //Show the date behind the long for (Long lo : longs) { Date date = new Date(lo); String string = formatter.format(date); System.out.println("Formated date : " + string + " = Long = " + lo); } } } 

Here are the results:

 Formated date : 05-12-2014 08:54:59.318 = Long = 1417766099318 Formated date : 01-01-1970 00:00:00.000 = Long = -3600000 Formated date : 01-01-1970 01:00:00.000 = Long = 0 Formated date : 31-11-1969 00:00:00.000 = Long = -2682000000 Formated date : 01-01-2014 00:00:00.000 = Long = 1388530800000 Formated date : 01-01-1970 12:59:59.999 = Long = -1 Formated date : 01-01-1970 01:00:00.000 = Long = 0 Formated date : 01-01-1970 01:00:00.001 = Long = 1 Formated date : 01-01-1970 03:01:00.000 = Long = 7260000 Formated date : 04-12-2014 04:14:44.037 = Long = 1417706084037 Formated date : 31-12-1969 10:59:00.000 = Long = -7260000 

Why:

 Formated date : 01-01-1970 01:00:00.000 = Long = 0 

It is at 1 am. I was expecting 0 in the morning.

+5
source share
3 answers

January 1, 1970 at midnight UTC. You need TimeZone like

 public static void main(String[] args) { TimeZone tz = TimeZone.getTimeZone("UTC"); Calendar cal = Calendar.getInstance(tz); cal.setTimeInMillis(0); DateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss.SSS"); sdf.setTimeZone(tz); System.out.println(sdf.format(cal.getTime())); } 

Exit

 01-01-1970 12:00:00.000 
+8
source

The time represented by a long 0 is midnight 1/1/1970 UTC. This happens at 1:00 1/1/1970 CET. But since you are using SimpleDateFormat , whose time zone is set to CET,

  • 1/1/1970 1:00 - this is the time that is displayed when formatting the date;
  • parsing 1/1/1970 1am gives you the time represented by long 0.

If you had a SimpleDateFormat whose time zone was set to UTC, the behavior would be completely different.

You can use the setTimeZone DateFormat method if you want to use a timezone other than CET.

+3
source

Two other answers are correct.

By the way, this kind of working with a date is much easier using the Joda-Time library or the java.time package (inspired by Joda-Time). Both libraries have time classes that have a clearly defined time zone (unlike java.util.Date/.Calendar).

Both Joda-Time and java.time use the same epoch : 1970-01-01T00:00:00Z .

Both use standard ISO 8601 formats when generating a textual representation of their date and time values.

Joda time

In Joda-Time 2.7.

 DateTime epoch = new DateTime( 0 , DateTimeZone.UTC ); 

java.time

In java.time Java 8 Update 45.

 ZonedDateTime epoch = ZonedDateTime.ofInstant( Instant.EPOCH , ZoneOffset.UTC ) ; 
+1
source

Source: https://habr.com/ru/post/1208409/


All Articles