Java中的时间和时区

时间:2022-03-21 22:08:58

关于时区的划分参见*:http://zh.wikipedia.org/wiki/%E6%99%82%E5%8D%80


Java中关于时间的类有两个关键的类:

java.util.Calendar;

java.util.Date;

今天在使用PostgreSQL数据库的时候,关于时间类型提供了一个timestamp with time zone,结果没注意,写入数据库的时间在页面上显示没能达到希望,问题出在该类型下的时间格式使用UTC来描述,这样要正确显示本地特征的日期就要做额外的处理。


写了几个测试,附带说明一下Java中的时间和时区

1.获取本地默认时区

@Test    public void test1() {
System.out.println("TimeZone.getDefault():" + TimeZone.getDefault());
}

默认时区内容:


TimeZone.getDefault():sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]

2.支持的时区信息


@Test    public void test3() {        String[] ids = TimeZone.getAvailableIDs();        System.out.println("TimeZone AvailableIDs Numbers :" + ids.length);        for (String id : ids) {            System.out.println("TimeZone:Id-" + id);        }    }

部分结果:

TimeZone AvailableIDs Numbers :619TimeZone:Id-Etc/GMT+12TimeZone:Id-Etc/GMT+11TimeZone:Id-Pacific/MidwayTimeZone:Id-Pacific/NiueTimeZone:Id-Pacific/Pago_PagoTimeZone:Id-Pacific/SamoaTimeZone:Id-US/SamoaTimeZone:Id-America/AdakTimeZone:Id-America/AtkaTimeZone:Id-Etc/GMT+10TimeZone:Id-HSTTimeZone:Id-Pacific/HonoluluTimeZone:Id-Pacific/JohnstonTimeZone:Id-Pacific/RarotongaTimeZone:Id-Pacific/TahitiTimeZone:Id-SystemV/HST10TimeZone:Id-US/AleutianTimeZone:Id-US/Hawaii

3.GMT时间和本地时间显示


@Test    public void test2() {        Date d = new Date();        System.out.println("Date.toGMTString():" + d.toGMTString());        System.out.println("Date.toLocaleString():" + d.toLocaleString());    }

结果:



Date.toGMTString():29 Sep 2013 10:25:37 GMTDate.toLocaleString():2013-9-29 18:25:37

4. 下面是Date对象的时间方法和Calendar对象方法对比

public void test4() {        Date d = new Date();        System.out.println("java.util.Date:");        System.out.println("Date.getYear():" + d.getYear());        System.out.println("Date.getMonth():" + d.getMonth());        System.out.println("Date.getDay():" + d.getDay());        System.out.println("Date.getHours():" + d.getHours());        System.out.println("Date.getMinutes():" + d.getMinutes());        System.out.println("Date.getSeconds():" + d.getSeconds());    }public void test10() {        /**         * JDK1.1后:抛弃Date类,使用Calendar类         */        Calendar c = Calendar.getInstance();        System.out.println("YEAR:" + (c.get(Calendar.YEAR)));        System.out.println("MONTH:" + ((c.get(Calendar.MONTH)) + 1));        System.out.println("DAY_OF_MONTH:" + (c.get(Calendar.DAY_OF_MONTH)));        System.out.println("HOUR_OF_DAY:" + (c.get(Calendar.HOUR_OF_DAY)));        System.out.println("MINUTE:" + (c.get(Calendar.MINUTE)));        System.out.println("SECOND:" + (c.get(Calendar.SECOND)));        System.out.println("DAY_OF_WEEK:" + (c.get(Calendar.DAY_OF_WEEK)));        System.out.println("DAY_OF_WEEK_IN_MONTH:"                + (c.get(Calendar.DAY_OF_WEEK_IN_MONTH)));        System.out.println("DAY_OF_YEAR:" + (c.get(Calendar.DAY_OF_YEAR)));    }

结果:

Date类:结果java.util.Date:Date.getYear():113Date.getMonth():8Date.getDay():0Date.getHours():18Date.getMinutes():25Date.getSeconds():37Calendar类:结果YEAR:2013MONTH:9DAY_OF_MONTH:29HOUR_OF_DAY:18MINUTE:25SECOND:37DAY_OF_WEEK:1DAY_OF_WEEK_IN_MONTH:5DAY_OF_YEAR:272

Date类的大多数方法已经弃用,建议使用Calendar类,Calendar提供了功能更加完整,强大的时间处理方法和属性。


4.关于年和毫秒数


Date实例获取的year是当前年份与1900之差。

Date实例的getTime()返回当前时间距离:1970-01-01 00:00:00毫秒数。

历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)和1900年1月1日的00:00:00.000两个时间点是Java开发中时间日期的重要参考量。


5.UTC时间

@Test    public void test5() {        long times = Date.UTC(2, 2, 1, 1, 1, 59);        System.out.println("Date.UTC(2, 2, 1, 1, 1, 59):" + times);        times = Date.UTC(113, 2, 1, 1, 1, 59);        System.out.println("Date.UTC(113, 2, 1, 1, 1, 59):" + times);    }

结果:


Date.UTC(2, 2, 1, 1, 1, 59):-2140815481000Date.UTC(113, 2, 1, 1, 1, 59):1362099719000

这里的时间参考点就是:1970 年 1 月 1 日的 00:00:00.000


附一张时区图:

Java中的时间和时区


本文出自 “野马红尘” 博客,谢绝转载!