Calendar & Date & TimeZone & Locale & ResourceBundle UTC GMT CST WST 闰年闰秒

Greenwich ['ɡri:nidʒ] n. 格林尼治(英国伦敦东南一市镇, 从前皇家天文台的所在地; 通过该天文台的经线被定为本初子午线)
GMT [,dʒi: em 'ti:] abbr. 格林尼治标准时间(Greenwich Mean Time)
UTC Universal Time Coordinated世界调整时间 (UTC使用原子钟,在百万年内几乎都能保持恒速,但是由于地球自转速度变慢,使用leap second来调整原子钟的时间来适应地球自转速度。从1972年开始,截至到今天2012年4月13号,总共有24个闰秒存在,下个闰秒在2012年6月被加进来。)
UTC Universal time code国际标准时间码
CST=China Standard Time 中国标准时间
WST=World Standard Time 世界标准时间(新的WST是UTC时间)
Leap year闰年:是为了弥补因人为历法规定( JSE中默认使用GregorianCalendar格里高日历,有闰年,没有闰秒)造成的年度天数与地球实际公转周期的时间差而设立的。通常的解释都是说一年有多少天多少小时多少分,取整数365还有多余的,累积达到一天24小时后,就多加一天的年是闰年。补上时间差的年份为闰年。闰年共有366天,2月份有29天。闰年定义:四年一闰,百年不闰,四百年再闰。
不同的日历对于这多出来的一天处理方式不同,闰年计算方式也不同。比如格里高日历中有润日,农历中有闰月!格里高日历闰年规则:被4整除,世纪初的年份被400整除的是闰年。(1900不是,2000是闰年);而Julian日历规定被4整除就是闰年。
Daylight Saving Time:DST是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。 对于上下班时间有影响。

基于Java6文档
java.util.Calendar:是一个抽象类,用来对特定的时间点在YEAR, MONTH, DAY_OF_MONTH, HOUR等纬度进行 转换和操作(加、减等)。注意是 Calendar是受TimeZone时区和Locale区域影响的。
Calendar中包含的不同纬度:
  • Calendar.YEAR——年份
  • Calendar.MONTH——月份
  • Calendar.DATE——日期
  • Calendar.DAY_OF_MONTH——日期,和上面的字段完全相同
  • Calendar.HOUR——12小时制的小时数
  • Calendar.HOUR_OF_DAY——24小时制的小时数
  • Calendar.MINUTE——分钟
  • Calendar.SECOND——秒
  • Calendar.DAY_OF_WEEK——星期几

默认的无参方法getInstance是根据当前JVM所在机器的TimeZone和Locale并取得当前机器时间。(getInstance Gets a calendar using the default time zone and locale. The Calendar returned is based on the current time in the default time zone with the default locale.)
Calendar的属性lenient:lenient模式下(Calendar默认lenient=true),32 January 2006是允许存在的。非lenient模式下,32 January 2006会出异常。

java.util.TimeZone表示相对于GMT格林尼治时区的偏移量,和locale没有关系,TimeZone类的实例中可以直接得到offset偏移量的值。getDefault方法可以取得默认的时区,
getAvailableIDs()可以取得所有可用的时区,
getTimeZone("GMT"), getTimeZone("Asia/Shanghai")可以取得特定的时区。
如果需要的时区不存在,也可以根据规则自定义时区。

java.util.Locale:表示一个地理上,政治上或者文化上的特定区域。一个操作如果需要Locale 来执行任务,那么这个操作就是locale-sensitive区域敏感的。譬如显示一个日期、数字就是locale-sensitive的操作---需要根据用户的的国家,区域或者文化的规定或者习惯来格式化显示。

构造函数:
Locale(String language)
Locale(String language, String country)
Locale(String language, String country, String variant)
由构造函数可以看出, 一个Locale最多有3部分构成,每部分之间用下划线分隔,如zh_TW,ja_JP。具体参数如下:
language语言代码 是一个ISO Language Code, 根据 ISO-639定义由2个小写字母构成 其中定义汉语Chinese的代码为zh 英语English的代码为en 日语Japanese的代码ja
country国家代码 是一个ISO Country Code, 根据 ISO 3166 Codes (Countries)定义由2个大写字母构成 其中定义中国China的代码为CN 美国的代码US 日本的代码JP
variant变体是供应商或者浏览器特定的代码。如WIN for Windows, MAC for Macintosh, and POSIX for POSIX。多部分变体之间也用下划线分隔。

Locale中定义了很多常用的变量方便用户使用如Locale.US(en_US), Locale.CHINA(zh_CN) , Locale.JAPAN(ja_JP)等。
Locale敏感的类例子:NumberFormat

java.util.ResourceBundle:包含一个特定locale的对象,用来做国际化:根据指定用户的locale取得相应locale的资源。 Resource bundles资源镞的名字是由1个基本名字和用来标识locale的额外名字构成。如基本名字是MyResources,MyResources_de,MyResources_zh_CN等
调用特定对象的资源文件:
ResourceBundle myResources = ResourceBundle.getBundle("MyResources", currentLocale);

java.util.Date:表示 一个特定的时间点,有毫秒的精度。无参构造函数生成时,使用的是JVM所在的机器的时间,并且是最接近的毫秒。它 没有TimeZone时区和Locale区域的设置。同时对于对日期进行加、减、今天是周几等操作时,一般使推荐用Calendar。
在 JDK 1.1 之前,类 Date 有两个主要功能。它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和分析日期字符串。不过,这些函数的 API 不易于实现国际化。从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和分析日期字符串。Date 中的相应方法已废弃。

UTC(Universal Time Coordinated)世界调整时间中,每过1,2年就会有额外的一秒(地球自转速度变化导致的),称为 leap second “闰秒”,闰秒总是被加在一天中的最后一秒,并且总是加在12月31号或者6月30号。例如:1995年的最后一分钟就是有61秒。 而几乎所有的现在操作系统都假设1天 = 24 × 60 × 60 = 86400秒。因此由于闰秒的存在,大部分电脑都不能精确地反应出这一秒。这也是为什么电脑需要做周期性的时间同步的原因。 Date类并没有反应出UTC中的闰秒,它直接从操作系统取得时间。 Calendar也是应该从操作系统取得时间。也就是说JVM在电脑上使用的Date和Calendar的毫秒数中都不包含leap second。

有些电脑采用GMT(Greenwich mean time) 格林尼治时间(等同于UT世界时间),GMT是生活中的叫法,UT是科学上的叫法。UTC是根据原子钟,UT是根据天文观测。

Date中设置或者返回年,月,日,时,分,秒的值:
  • A year y is represented by the integer y - 1900.
  • A month is represented by an integer from 0 to 11; 0 is January, 1 is February, and so forth; thus 11 is December.
  • A date (day of month) is represented by an integer from 1 to 31 in the usual manner.
  • An hour is represented by an integer from 0 to 23. Thus, the hour from midnight to 1 a.m. is hour 0, and the hour from noon to 1 p.m. is hour 12.
  • A minute is represented by an integer from 0 to 59 in the usual manner.
  • A second is represented by an integer from 0 to 61; 值 60 和 61 只对闰秒发生,尽管那样,也只用在实际正确跟踪闰秒的 Java 实现中。于按当前引入闰秒的方式,两个闰秒在同一分钟内发生是极不可能的,但此规范遵循 ISO C 的日期和时间约定。

java.sql.Date, java.sql.Time, java.sql.TimeStamp是java.util.Date类的子类。 是给JDBC用来表示SQL DATE, SQL TIME和 SQL TIMESTAMP数据库字段。为了符合SQL对于自己数据类型的要求,上述3个Date子类都做了一定的限制。
java.sql.Date对一个毫秒值进行了简单的包装(毫秒值计算是从GMT时间 1970年1月1号0时0分0秒开始的),用来给 JDBC表示一个SQL DATE的值。根据SQL DATE的规定, java.sql.Date对应实例的时分秒要等于0.
java.sql.Time对java.util.Date进行了简单的包装,用来给 JDBC表示一个SQL TIME的值。 这个字段的日期部分的值固定为January 1, 1970并且不可修改

疑问:
getTimeInMillis的时间偏移量(因为基准是1970年1月1号 GMT标准时间)
Calendar的getTimeInMillis的毫秒数,是否已经把历史上的毫秒数统计进去?使用格里高日历,应该没有包含。

你可能感兴趣的:(ResourceBundle)