JAVA日期和时间类彻底解决(1)

来源:互联网 发布:淘宝上怎么找旺旺 编辑:程序博客网 时间:2024/05/22 14:16

What's your time zone?

JAVA日期和时间类彻底解决(1)

Page 1 of 3

你是否在苦苦挣扎在JAVA语言中的日期和时间中?当你在计算机上显示日期和时间时,, 是否要快一个小时?或者可能要早一个小时?, 或者两个小时, 或者更严重? 当你试图用JAVA写日期和时间到一个文件中,或者到你的数据库中(通过Java Database Connectivity (JDBC))— 错误的时间被保存了吗?

我曾经被这个问题困饶过很长时间。我不能解决为什么JAVA改变了我给的时间戳(timestamps)。我从数据库中检索时间戳数据并显示在我的图形用户接口(GUI)中时, 总是会显示一个不同的时间—和我期望的值要相差1,2或3个小时。我重新检查了数据库中的值,它是正常的。 那么到底应该怎么办呢?

调查 
最终我决定对这种情况来调查一番。首先,我写了一个简单的JAVA类:

import java.util.*;

public class DateTest {
  public static void main(String[] args) {
    System.out.println("Date = " + new Date());
    System.out.println("Calendar = " + Calendar.getInstance());
  }
}

在Windows 98 的 Java 2 Platform, Standard Edition (J2SE) 1.3.1_01,,我得到:

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]

在Sun Solaris 7 with J2SE 1.3.1_02,我得到:

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]

在 Linux Mandrake 7.2 with J2SE 1.3.0, 我得到:

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]

你看到了,Calendar类似乎有一个类成员是java.util.SimpleTimeZone的一个实例,并且我也能通过一些办法确定:

  1. 使用javap实用程序,它是J2SE的一部分:

    javap -private java.util.Calendar

     

  2. 检查J2SE中src.jar文件中可利用的源代码

  3. 实用JAVA的反射机制 

在任何一种情况下,你都会发现在java.util.Calendar类中有一个私有实例成员,名字为zone,它是java.util.TimeZone实例。javap结果的部分输出显示为:

private java.util.TimeZone zone

当我对java.util.Date类采用了同样的办法时,你也能发现它有以下成员:

private transient java.util.Calendar cal;

这个就间接的表明,Date类也是一个TimeZone成员。

然而,Java文档告诉我们TimeZone是一个抽象类,但是SimpleTimeZone是一个聚合子类。因此,尽管定义为成员,Calendar中的zone成员实际上是SimpleTimeZone实例,(在J2SE 1.3中)。 这个可以通过使用上面的方法来调查TimeZone很容易得到证实。真正地,Calendar中的zone成员是一个SimpleTimeZone实例。检查DateTest 类的输出,它涉及到TimeZone的夏令时(DST)属性,并为它们命名为以下属性:

  • dstSavings
  • useDaylight
  • startYear
  • startMode
  • startMonth
  • startDay
  • startDayOfWeek
  • startTime
  • startTimeMode
  • endMode
  • endMonth
  • endDay
  • endDayOfWeek
  • endTime
  • endTimeMode

因此你能看到,DateCalendar类在Daylight Saving Time上有一个概念。 档我开始调查这个的时候,是summer (last year), 为了调整我们服务器所有的夏令时(DST),我将系统时间向前挪移了一个小时。因此,我认为JAVA将不会对DST进行调整。

Translated by Willpower,2003.11.17

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 买了瓶过期香水怎么办 宝宝吃了润唇膏怎么办 新生3天宝宝打嗝怎么办 咖啡喝多了恶心怎么办 喝咖啡恶心想吐怎么办 咖啡喝多了头晕怎么办 喝咖啡反胃想吐怎么办 咖啡喝多了胃疼怎么办 喝了咖啡想吐怎么办 微商别人觉得贵怎么办 id被别人锁定了怎么办 2017闯红灯扣6分怎么办 乐天玛特超市卡怎么办 乐天玛特的卡怎么办 乐天玛特倒闭 卡怎么办 公租房五年到期怎么办 超市的水杯坏了怎么办 玩天涯明月刀卡怎么办? 想开童装店没什么经验怎么办 孕后期鼻炎犯了怎么办 酷狗国外听不了怎么办 酷狗音乐换手机怎么办 有优势卵泡不排卵怎么办 卵泡30mm不破怎么办 成熟的卵泡不破怎么办 卵泡大了不破怎么办 卵泡突然不长了怎么办 想怀孕卵泡不长怎么办 吉吉影音下载慢怎么办 辞职后社保断了怎么办 2岁泡泡糖咽下去怎么办 我在拼多多开团怎么办 养了一条鱼死了怎么办 鱼缸的鱼尾巴烂怎么办 捡到玉佛吊坠该怎么办 晚上睡不踏实多梦易醒怎么办 红米3s蓝屏怎么办 吃饭没给钱跑了怎么办 刚出生的宝宝红屁屁怎么办 刚出生的宝宝红屁股怎么办 眼镜配高了25度怎么办