Java中的时间和时区

简介:

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

java.util.Calendar;

java.util.Date;

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


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

1.获取本地默认时区

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

默认时区内容:


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

2.支持的时区信息


1
2
3
4
5
6
7
8
@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);
         }
     }

部分结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
TimeZone AvailableIDs Numbers : 619
TimeZone:Id-Etc/GMT+ 12
TimeZone:Id-Etc/GMT+ 11
TimeZone:Id-Pacific/Midway
TimeZone:Id-Pacific/Niue
TimeZone:Id-Pacific/Pago_Pago
TimeZone:Id-Pacific/Samoa
TimeZone:Id-US/Samoa
TimeZone:Id-America/Adak
TimeZone:Id-America/Atka
TimeZone:Id-Etc/GMT+ 10
TimeZone:Id-HST
TimeZone:Id-Pacific/Honolulu
TimeZone:Id-Pacific/Johnston
TimeZone:Id-Pacific/Rarotonga
TimeZone:Id-Pacific/Tahiti
TimeZone:Id-SystemV/HST10
TimeZone:Id-US/Aleutian
TimeZone:Id-US/Hawaii

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


1
2
3
4
5
6
@Test
     public  void  test2() {
         Date  d =  new  Date ();
         System.out.println( "Date.toGMTString():"  + d.toGMTString());
         System.out.println( "Date.toLocaleString():"  + d.toLocaleString());
     }

结果:



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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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)));
     }

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Date类:
结果
java.util.Date:
Date.getYear():113
Date.getMonth():8
Date.getDay():0
Date.getHours():18
Date.getMinutes():25
Date.getSeconds():37
Calendar类:
结果
YEAR:2013
MONTH:9
DAY_OF_MONTH:29
HOUR_OF_DAY:18
MINUTE:25
SECOND:37
DAY_OF_WEEK:1
DAY_OF_WEEK_IN_MONTH:5
DAY_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时间

1
2
3
4
5
6
7
@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);
     }

结果:


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

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


附一张时区图:

191120811.jpg



本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1303566,如需转载请自行联系原作者

相关文章
|
3月前
|
Java
Java实现:将带时区的时间字符串转换为LocalDateTime对象
通过上述方法,你可以将带时区的时间字符串准确地转换为 `LocalDateTime`对象,这对于处理不需要时区信息的日期和时间场景非常有用。
875 4
|
7月前
|
Java
java 时区转换日期转换:东八区转为UTC零时区
java 时区转换日期转换:东八区转为UTC零时区
272 0
|
7月前
|
Java
java 时区转换日期转换:UTC零时区转成东八区-19位
java 时区转换日期转换:UTC零时区转成东八区-19位
199 0
|
Java
java时间换算(BJU转UTC)
UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8。现在,你的程序要读入一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果分小于10分,需要保留十位上的0。如1124表示11点24分,而905表示9点5分,36表示0点36分,7表示0点7分。
305 0
java时间换算(BJU转UTC)
|
Java
java判断当前时间是否在某个时间区间内(可精确到毫秒)
java判断当前时间是否在某个时间区间内(可精确到毫秒)
869 0
java判断当前时间是否在某个时间区间内(可精确到毫秒)
|
算法 搜索推荐 Java
线性时间选择(Top K)问题(Java)
线性时间选择(Top K)问题(Java)
267 0
线性时间选择(Top K)问题(Java)
java获取时间间隔,获取当天每隔15分钟的时间
Java开发中日常遇到的关于时间的问题
java获取时间间隔,获取当天每隔15分钟的时间
|
Java 程序员
Java中如何处理时间--Date类
在实际业务中,总会碰到关于时间的问题,例如收集当年的第一季度的数据。第一季度也就是当年的一月一日到三月三十一日。如何处理时间的逻辑,如果用字符串去处理显然不可以,Java有专门的处理时间的类,在此记录一下。Date 类有如下两个构造方法。Date():此种形式表示分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),使用该构造方法创建的对象可以获取本地的当前时间。
179 0
Java中如何处理时间--Date类
|
关系型数据库 MySQL Java
Linux系统下java程序获取的时间与系统时间不一致的问题
解决Linux系统下java程序获取的时间与系统时间不一致的问题
1391 0
Linux系统下java程序获取的时间与系统时间不一致的问题
Java&Android获取当前日期、时间、星期几、获取指定格式的日期时间、时间戳工具类包含使用示例
Java&Android获取当前日期、时间、星期几、获取指定格式的日期时间、时间戳工具类包含使用示例
729 0
Java&Android获取当前日期、时间、星期几、获取指定格式的日期时间、时间戳工具类包含使用示例