What's your time zone?
Java date and time class (1)
Page 1 of 3
Are you struggling with dates and times in Java? Does it take an hour for you to display the date and time on your computer? Or an hour earlier ?, Or two hours, or more serious? When you try to use Java to write the date and time to a file, or to your database (through Java database connectivity (JDBC)-is the error time saved?
I have been troubled by this problem for a long time. I cannot solve Why JAVA changed the timestamps I gave ). When I retrieve timestamp data from the database and display it in my graphical user interface (GUI, it will always show a different time-a difference of 1, 2 or 3 hours from my expected value. I re-checked the value in the database. It is normal. So what should we do?
Investigation
In the end, I decided to investigate this situation. First, I wrote a simple Java class:
import java.util.*;
public class DateTest {
public static void main(String[] args) {
System.out.println("Date = " + new Date());
System.out.println("Calendar = " + Calendar.getInstance());
}
}
In Windows 98 Java 2 platform, Standard Edition (j2se) 1.3.1 _ 01, I get:
Date = Tue May 06 08:13:17 IDT 2003
Calendar = java.util.GregorianCalendar[time=1052197997184,areFieldsSet=true,areAllFieldsSet
=true,lenient=false,zone=java.util.SimpleTimeZone[id=Asia/Jerusalem,offset=7200000,
dstSavings=3600000,useDaylight=true,startYear=0,startMode=1,startMonth=3,startDay=9,
startDayOfWeek=0,startTime=3600000,startTimeMode=0,endMode=1,endMonth=8,endDay=24,
endDayOfWeek=0,endTime=3600000,endTimeMode=0],firstDayOfWeek=1,minimalDaysInFirstWeek=1,
ERA=1,YEAR=2003,MONTH=4,WEEK_OF_YEAR=19,WEEK_OF_MONTH=2,DAY_OF_MONTH=6,DAY_OF_YEAR=126,
DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=8,HOUR_OF_DAY=8,MINUTE=13,SECOND=17,
MILLISECOND=184,ZONE_OFFSET=7200000,DST_OFFSET=3600000]
In Sun Solaris 7 with j2se 1.3.1 _ 02, I get:
Date = Tue May 06 08:13:17 IDT 2003
Calendar = java.util.GregorianCalendar[time=1052197997184,areFieldsSet=true,areAllFieldsSet
=true,lenient=false,zone=java.util.SimpleTimeZone[id=Asia/Jerusalem,offset=7200000,
dstSavings=3600000,useDaylight=true,startYear=0,startMode=1,startMonth=3,startDay=9,
startDayOfWeek=0,startTime=3600000,startTimeMode=0,endMode=1,endMonth=8,endDay=24,
endDayOfWeek=0,endTime=3600000,endTimeMode=0],firstDayOfWeek=1,minimalDaysInFirstWeek=1,
ERA=1,YEAR=2003,MONTH=4,WEEK_OF_YEAR=19,WEEK_OF_MONTH=2,DAY_OF_MONTH=6,DAY_OF_YEAR=126,
DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=8,HOUR_OF_DAY=8,MINUTE=13,SECOND=17,
MILLISECOND=184,ZONE_OFFSET=7200000,DST_OFFSET=3600000]
In Linux Mandrake 7.2 With j2se 1.3.0, I get:
Date = Mon May 05 21:04:32 GMT+00:00 2003
Calendar = java.util.GregorianCalendar[time=1052168673155,areFieldsSet=true,areAllFieldsSet
=true,lenient=true,zone=java.util.SimpleTimeZone[id=Custom,offset=0,dstSavings=3600000,
useDaylight=false,startYear=0,startMode=0,startMonth=0,startDay=0,startDayOfWeek=0,
startTime=0,startTimeMode=0,endMode=0,endMonth=0,endDay=0,endDayOfWeek=0,endTime=0,
endTimeMode=0],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2003,MONTH=4,
WEEK_OF_YEAR=19,WEEK_OF_MONTH=2,DAY_OF_MONTH=5,DAY_OF_YEAR=125,DAY_OF_WEEK=2,
DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=4,SECOND=33,MILLISECOND=155,
ZONE_OFFSET=0,DST_OFFSET=0]
You see,Calendar
A class member seems to beAn instance of Java. util. simpletimezone,
In addition, I can determine through some methods:
Use the javap utility, which is part of j2se:javap -private java.util.Calendar
- Check j2se
Available source code in the SRC. JAR File
- Practical Java reflection mechanism
In any case, you will find that there is a private instance Member in the Java. util. Calendar class named zone, which is a Java. util. timezone instance. Some of the javap results are displayed as follows:
private java.util.TimeZone zone
Whenjava.util.Date
When the same method is adopted for a class, you can also find that it has the following members:
private transient java.util.Calendar cal;
This indirectly indicates that,Date
Class is also a timeZone
Member.
However, the Java document tells usTimeZone
Is an abstract class,SimpleTimeZone
Is an aggregation subclass. Therefore, even if it is defined as a memberA zone member is actually a simpletimezone instance,
(In j2se 1.3 ). This can be easily confirmed by investigating timezone using the above method. Truly,In the calendar arZone Member
IsSimpleTimeZone
Instance. CheckDateTest
Class output, which involves the timezone Runtime (DST) Attribute and names them as the following attributes:
dstSavings
useDaylight
startYear
startMode
startMonth
startDay
startDayOfWeek
startTime
startTimeMode
endMode
endMonth
endDay
endDayOfWeek
endTime
endTimeMode
So you can see,Date
AndCalendar
Class has a concept in daylight saving time. When I started investigating this, it was summer (last year). In order to adjust all the clock times on our server (DST), I moved the system time one hour forward. Therefore, I don't think Java will adjust DST.
Translated by willpower, 2003.11.17