18910140161

时间、日期格式总结 一、CST和GMT时间的区别(http://www.cnblogs.com/sanshi/archive/2009/08/28/1555717.html)

顺晟科技

2022-09-15 20:21:27

134

转载

问题描述 
今天遇到一个奇怪的问题,在服务器端通过 Java 获取当前时间为 Fri Aug 28 09:37:46 CST 2009, 转化为GMT时间为:28 Aug 2009 01:37:46 GMT,也就是说GMT时间加上 8 个小时等于CST表示的时间, 那这个CST不就是北京时间么,因为我们是在东八区的。 

一切看起来很正常,不过在客户端用JavaScript解析这个时间就有问题了: 

1 2 // Fri Aug 28 2009 23:37:46 GMT+0800new Date(\'Fri Aug 28 09:37:46 CST 2009\').toString();


好奇怪,这次GMT和CST表示的时间居然相差整整 14 个小时? 



百度一下 

找到这篇文章,问题已经很明了。 

GMT(Greenwich Mean Time)代表格林尼治标准时间,这个大家都知道。 
而CST却同时可以代表如下 4 个不同的时区: 

  • Central Standard Time (USA) UT-6:00
  • Central Standard Time (Australia) UT+9:30
  • China Standard Time UT+8:00
  • Cuba Standard Time UT-4:00


可见,CST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间。 

前面提到的通过 Java 获取的CST时间用的是China Standard Time,而客户端JavaScript则默认采用的是美国的中部时间。 

所以将 Fri Aug 28 09:37:46 CST 2009 加上 6 个小时,再加上 8 个小时,就等于 Fri Aug 28 2009 23:37:46 GMT+0800 

可见,在以后的编程中为了避免错误,还是不要使用CST时间,而尽量采用GMT时间。 

二、地球东西经是咋划分的

以0°界线为界,向东是东经,向西是西经.北半球图,以0°经线为界,逆时针方向是东经,顺时针方向是西经;南半球图,以0°经线为界,逆时针方向是西经,顺时针方向是东经.
判断方法:北半球图,将两手伸开,大拇指与其余四指垂直,把两手大拇指贴在0°界线上,大拇指指向北极,此时沿右手四指方向是东经,沿左手四指方向是西经.
南半球图:方法同样,大拇指向下就可以了.

三、地球自转、公转运动方向都向东?(http://old.pep.com.cn/gzdl/xszx/xxzd/201109/t20110919_1069289.htm)

二、地球自转

 

1.自转轨道

 

地球绕其地轴的旋转叫自转,其自转轨道面叫赤道平面。

 

2.自转方向

 

地球的自转方向为自西向东,这是约定成俗的。实际上,是先有地球的自转方向,后有地球的东西方向,即规定地球的自转方向就是地球上向东的方向,即地球的自转就是自西向东自转,这是不容也没有必要讨论的。如图二:图中箭头方向表示自西向东,也表示地球自转方向,二者是一致的。

 

三、地球公转

 

1.公转轨道

 

地球自转的同时也在公转,其公转轨道是一个近似正圆的椭圆轨道。太阳位于椭圆的一个焦点上,地球绕日公转轨道面叫黄道平面。

 

2.公转方向

 

从黄北极上空向下看,地球在黄道上沿逆时针方向绕太阳公转。

但实际上,由于地球自转轨道面(赤道平面)与公转轨道面(黄道平面)并不重合。而是存在23°26′的夹角。所以,地球的自转方向与公转方向应该是不一致的(如图四所示)。

 

所以在地球自转方向为自西向东的前提下,地球公转方向亦为自西向东的说法是有争议的。可以这么认为,地球的自转方向为自西向东,地球的公转方向大体上也为自西向东。当然,地球公转方向实际应该是:从冬至经春分到夏至为向东→东偏北23°26′→向东的方向运动,从夏至经秋分到冬至为向东→东偏南23°26′→向东的方向运动,循环往复。

 

四、结论

 

1. 地球自转方向:自西向东。

 

2. 地球绕日公转方向:从冬至经春分到夏至为向东→东偏北23°26′→向东的方向运动,从夏至经秋分到冬至为向东→东偏南23°26′→向东的方向运动,循环往复。

(http://blog.csdn.net/fanst_/article/details/50627744 from )

时区

时区是地球上的区域使用同一个时间定义。以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同经度的地方的时间有所不同(地方时)。1863年,首次使用时区的概念。时区通过设立一个区域的标准时间部分地解决了这个问题。世界各个国家位于地球不同位置上,因此不同国家的日出、日落时间必定有所偏差。这些偏差就是所谓的时差。

理论时区

理论时区以被15整除的子午线为中心,向东西两侧延伸7.5度,即每15°划分一个时区,这是理论时区。理论时区的时间采用其中间经线(或标准经线)的地方时。所以每差一个时区,区时相差一个小时,相差多少个时区,就相差多少个小时。东边的时区时间比西边的时区时间来得早。为了避免日期的紊乱,提出国际日期变更线的概念。

实际时区

         但是,为了避开国界线,有的时区的形状并不规则,而且比较大的国家以国家内部行政分界线为时区界线,这是实际时区,即法定时区。

本初子午线

英语:Prime meridian,即0度经线,亦称格林威治子午线、格林尼治子午线或本初经线,是经过英国格林尼治天文台的一条经线(亦称子午线)。本初子午线的东西两边分别定为东经和西经,于180度相遇。

国际日期变更线

         英语:InternationalDate Line,又名国际日界线、国际换日线或国际日期线,这条子午线由于穿越陆地,而在陆地变更日期既不方便也不可行,故实际使用的国际换日线是一条基本上只经过海洋表面的折线(见附图)。

为了解决日期紊乱问题,大体以180度经线为日界线;由于照顾行政区域的统一,日界线并不完全沿180°的子午线划分,而是绕过一些岛屿和海峡:由北往南通过白令海峡和阿留申、萨摩亚、斐济、汤加等群岛到达新西兰的东边。

         须注意的是,是由东向西越过此线,(从0hr到24hr)日期需加一天;由西向东越过此线,(从24hr到0hr)日期需减一天;如:于2011年4月8日15:45向东航行跨过此线,时间应变为2011年4月7日15:45。原理是从零度经线所在时区向东每跨 1 个区间时钟就拨快 1 小时, 而向西每跨 1 个区间时钟就拨慢 1 小时, 如此一来, 到了另一端经线 180 度附近, 就会有 24 小时的落差。为了平衡此一误差, 人们因而订定了国际换日线。

UTC

协调世界时,又称世界标准时间或世界协调时间,简称UTC(从英文“Coordinated Universal Time”/法文“Temps UniverselCoordonné”而来),是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间。

GMT

世界时UT即格林尼治时间,格林尼治所在地的标准时间。

Unix Time

Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)

是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

 

夏令时

夏时制,夏时令(DaylightSaving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。

    夏令时为一个时间段,一般在进入时刻将时钟调快一小时(例如2:00调为3:00),在退出时刻将时钟调慢一小时(例如3:00调为2:00)。

常用Java对时间的处理

本地时间

本地时间是一个相对概念,不同时区的8:00并不是同一个时刻。

从编码的角度去理解为UTC的1970年1月1日00:00:00这一时刻,加上经过的时间差(两个时刻间的时间偏移量),再换算为当前时区时间。

与Unix Time(UTC的1970年1月1日00:00:00)的时间差,是时间偏移的绝对值,这个值本身没有时区属性,是进行时间转换的基准(重要)。

java.util.Date

Date本质上就是相对UnixTime的毫秒数,这一点从其构造函数上可以看出来:

public Date() {

        this(System.currentTimeMillis());

}

 

public Date(longdate) {

        fastTime =date;

}

 

那么为什么Date().toString()会有时区属性呢(例如:“TueFeb 02 09:59:25 CST 2016”),可以通过阅读其toString方法得到答案。

待补充

System.currentTimeMillis()

当前时刻与Unix Time的偏移毫秒数绝对值,与时区无关。

// 系统默认的时区,影响date.toString()打印的展示结果

    TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));

上面两个例子可以得出结论:

1.      sdf.setTimeZone(TimeZone.getTimeZone(timeZoneId));指定待解析的时间是哪个时区的时间。

2.      TimeZone.setDefault(TimeZone.getTimeZone("timeZoneId"));指定系统默认时区,影响Date.toString()的打印。

java.util.Calendar

Calendar本质上与Date类似,是相对于UnixTime的毫秒数,这一点从其setTime()方法可以看出来:

public final void setTime(Date date) {

    setTimeInMillis(date.getTime());

}

 

cal.setTimeZone()作用是指定Calendar以什么时区的形式展示日历。

如何得到供展示的时间格式?

通过上面种种分析,我们得到结论,各种接口、模块、系统间,最不容易出现误解的针对时间的参数传递方式,就是传递相对Unix Time的毫秒数。

那么我们如何从毫秒数格式化为需要的展示形式呢?(明显直接Date.toString不能满足各种格式需要)

(http://blog.csdn.net/fanst_/article/details/50627744     end.)

 http://www.cnblogs.com/zhaozhan/archive/2010/12/21/1913184.html

就象日期和日历格式一样,时间格式在全球各地也不是一成不变的。虽然每种时间表示基本上都显示小时、分钟和秒,但其显示顺序和分隔符相差很大。实际上,同一国家/地区的各地域之间也可能存在许多差异。不同地域之间的时间格式设置差异表现在以下三个方面中:

      1、使用12小时或24小时时钟:大多数欧洲和亚洲区域设置采用 24 小时时钟,而美国采用 12 小时 A.M./P.M. 模型。在国家/地区的语言中也可以出现 A.M./P.M.,在一些语言中,它位于时间之前而不是时间之后。

      2、用于分隔小时、分钟和秒的字符。虽然冒号 (:) 是分隔小时、分钟和秒最常用的字符,但一些亚洲语言使用的是象形字符。另外,一些区域设置要求显示 "h"、"m" 和 "s"。

      3、时区的存储和显示。显示时区的一种最常见方式是以 GMT(格林尼治标准时间)或目前的 UTC(世界协调时间)为基础。后面紧跟着时区,表示为以小时和分钟计的正负偏移量。(一些时区使用 30 分钟或 45 分钟偏移量。)例如,印度班格洛尔的时区将显示为 UTC +5:30,而对于新西兰的查塔姆群岛,时区将为 UTC +12:45。另一种显示时区的方式是使用当地时区的名称。如果您采用这种方法,必须要考虑以下几个方面:

  • 并非所有国家/地区都是使用当地名称。
  • 时区缩写并不是唯一的。
  • 并非所有国家/地区都使用夏令时,而且各国家/地区的夏令时的开始和结束日期并不相同。
  • 一个时区可能具有许多不同的名称,具体取决于国家/地区和语言。

时区

     时区是使用同一时间的地理区域。通常情况下,两个相邻时区之间相差一个小时,但情况并非总是如此。 世界上任何时区的时间都可以表示为协调世界时 (UTC) 的一个偏移量。

夏时制

      世界上的很多时区都支持夏时制。夏时制会在春季或初夏将时间向前调一个小时,而在夏末或秋季将时间调回正常(或标准)时间,从而来尽量延长白昼时间。这些在夏时制和标准时间之间的来回变更称为调整规则。

      在特定的时区中,夏时制的来回转换既可以由固定调整规则定义,也可以由浮动调整规则定义。固定调整规则会指定一个特定的日期,并在每年的这一天进行夏时制的来回转换。 例如,夏时制在每年的 10 月 25 日转换为标准时间,这遵循的便是固定调整规则。 更为常见的是浮动调整规则,这种规则会指定特定月份中特定星期的一个特定日期,并在这一天进行夏时制的来回转换。例如,如果规定在3月的第三个星期日从标准时间转换为夏时制,这遵循的便是浮动调整规则。

ISO 8601

国际标准化组织的国际标准ISO 8601是日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》。目前最新为第三版ISO8601:2004,第一版为ISO8601:1988,第二版为ISO8601:2000。

日期表示法

编辑 年由4位数组成,以公历公元1年为0001年,以公元前1年为0000年,公元前2年为-0001年,其他以此类推。应用其他纪年法要换算成公历,但如果发送和接受信息的双方有共同一致同意的其他纪年法,可以自行应用。

日历日期表示法

编辑 年为4位数,月为2位数,月中的日为2位数,例如2004年5月3日可写成2004-05-03或20040503。 顺序日期表示法 可以将一年内的天数直接表示,平年365天,闰年366天。如2004年5月3日可以表示为2004-124或2004124

日历星期和日表示法

编辑 可以用2位数表示年内第几个日历星期,再加上一位数表示日历星期内第几天,但日历星期前要加上一个大写字母W,如2004年5月3日可写成2004-W19-1或2004W191。但2005-W011是从2005年1月3日开始的,前几天属于上年的第53个日历星期,每个日历星期从星期一开始,星期日为第7天。

日的时间表示法

编辑 小时、分和秒都用2位数表示,对UTC时间最后加一个大写字母Z,其他时区用实际时间加时差表示。如UTC时间下午2点30分5秒表示为14:30:05Z或143005Z,当时的北京时间表示为22:30:05+08:00或223005+0800,也可以简化成223005+08。

日期和时间的组合表示法

编辑 合并表示时,要在时间前面加一大写字母T,如要表示北京时间2004年5月3日下午5点30分8秒,可以写成2004-05-03T17:30:08+08:00或20040503T173008+08。

时间段表示法

编辑 如果要表示某一作为一段时间的时间期间,前面加一大写字母P,但时间段后都要加上相应的代表时间的大写字母。如在一年三个月五天六小时七分三十秒内,可以写成P1Y3M5DT6H7M30S。

重复时间表示法

编辑 前面加上一大写字母R,如要从2004年5月6日北京时间下午1点起重复半年零5天3小时,要重复3次,可以表示为R3/20040506T130000+08/P0Y6M5DT3H0M0S。对应的各地标准

中国

***国家标准GB/T 7408-2005《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:2000等效采用。 中华民国《中国国家标准》CNS 7648《资料元及交换格式·资讯交换·日期及时间的表示法》与ISO 8601类似,可用公元年,也可冠以大写R.O.C.字母用民国纪元。例如,2004年(中华民国九十三年)5月3日可写作2004-05-03或R.O.C.93-05-03。  

各种数据库中的时间日期类型  

1: sql server 日期类型:

为\'YYYY-MM-DD HH:MM:SS

2. mysql日期和时间类型:
DATE,日期。支持的范围为\'1000-01-01\'到\'9999-12-31\'。MySQL以\'YYYY-MM-DD\'格式显示DATE值
DATETIME,日期和时间的组合。支持的范围是\'1000-01-01 00:00:00\'到\'9999-12-31 23:59:59\'。MySQL以\'YYYY-MM-DD HH:MM:SS\'格式显示DATETIME值
TIMESTAMP[(M)],时间戳。TIMESTAMP值返回后显示为\'YYYY-MM-DD HH:MM:SS\'格式的字符串,显示宽度固定为19个字符。
TIME,时间。范围是\'-838:59:59\'到\'838:59:59\'。MySQL以\'HH:MM:SS\'格式显示TIME值
YEAR[(2|4)],两位或四位格式的年。默认是四位格式。在四位格式中,允许的值是1901到2155和0000。在两位格式中,允许的值是70到69,表示从1970年到2069年。MySQL以YYYY 格式显示YEAR值

3:JAVA默认的日期时间格式为       

 Thu Jul 07 17:05:39 CST 2005

如果想转化为2005-07-05 的格式,则需要使用类 SimpleDateFormat

  SimpleDateFormat formatt= new SimpleDateFormat("yyyy-MM-dd") ;
 Date date =new Date();
 System.out.println(formatt.format(date));

 则打印出的格式为:2005-07-07

  SimpleDateFormat formatt= new SimpleDateFormat("yyyy-MMMM-dd") ;
 Date date =new Date();
 System.out.println(formatt.format(date));

  则打印出的格式为:2005-七月-07

---------------------------

4:Oracle的默认日期格式

SQL> select sysdate from dual ;

SYSDATE
----------
07-7月-05

用to_char转化为yyyy-mm-dd的格式

SQL> select to_char(sysdate,\'yyyy-mm-dd\') Time from dual ;
TIME
----------
2005-07-07

在Oracle里有两个与date相关的函数 to_date()和to_char() ;

to_date() 作用将字符类型按一定格式转化为日期类型:

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

https://my.oschina.net/hulubo/blog/40888

时间区域和JAVA 
    涉及有关时间区域信息时Java和Solaris很相似。每个时间区域都有一个时间区域ID标识符。在J2SE 1.3 and 1.4中,这个ID是个字符串,是由位于J2SE 安装程序的jre/lib子目录中的tzmappings文件这些ID列表。 J2SE 1.3 仅仅只包含tzmappings文件,但是 J2SE 1.4包含世界不同地区的时间区域数据文件。jre/lib/zi存放着这些文件。在J2SE 1.4里,sun.util.calendar.ZoneInfo从这些文件获取DST规则。在Solaris中, 这些时间区域数据文件是以二进制形式存放的,不是文本文件,因此你不能看它们。 在J2SE 1.4中的时间区域数据文件和在Solaris中是不同的。 

     java.util.TimeZone类中getDefault方法的源代码显示,它最终是会调用sun.util.calendar.ZoneInfo类的getTimeZone 方法。这个方法为需要的时间区域返回一个作为ID的String参数。这个默认的时间区域ID是从 user.timezone (system)属性那里得到。如果user.timezone没有定义,它就会尝试从user.country和java.home (System)属性来得到ID。 如果它没有成功找到一个时间区域ID,它就会使用一个"fallback" 的GMT值。换句话说, 如果它没有计算出你的时间区域ID,它将使用GMT作为你默认的时间区域。 

注意,System属性是在java.lang.System类的initProperties方法中被初始化的。这是一个本地方法。因此源代码是不可用的----除非你深入到J2SE分发包中的本地代码库中去研究。然而,在Windows系统中,System 属性是从Windows注册表中被初始化的,而在Linux/Unix中是由环境变量来进行初始化。initProperties方法的Javadoc声明,某些属性"必须保证被定义" 且列出它们。被java.util.TimeZone类的getDefault方法使用的三个System属性中,只有java.home作为一种“保证的”属性在Javadoc中被列出。 

推荐的解决方案 
     因此,你如何确保JAVA能给你正确的时间和日期呢?***的办法是确认JAVA虚拟机(JVM)的默认TimeZone类是正确的,且是适合你的地理范围(Locale)的。你如何来确保默认TimeZone是正确的且适合的呢?这又是一个新问题了。象大多数处理的问题一样,这个也有许多解决方案。根据java.util.TimeZone.getDefault方法的源代码来看,***的办法是正确地设置user.timezone属性。在启动JAVA虚拟机时,你能很容易的通过使用 -D 命令 -line 参数的办法来覆盖(override)在java.lang.System.initProperties方法中所设置的值。例如: 

Java代码 复制代码  收藏代码
  1. java -Duser.timezone=Asia/Shanghai DateTest  

 

java -Duser.timezone=Asia/Shanghai DateTest


这个命令启动DateTest类,并设置 user.timezone属性到Asia/Shanghai。你也能够通过使用java.lang.System 类的setProperty方法来设置user.timezone 属性: 

Java代码 复制代码  收藏代码
  1. System.setProperty("user.timezone","Asia/Shanghai");  

 

System.setProperty("user.timezone","Asia/Shanghai");

如果没有一个可用的时间区域ID适合你,那么就你可以创建一个自定义TimeZone 使用java.util.TimeZone 类的 setDefault 方法将它设置为默认的时间区域----就象我先前在ItsInitializer 类中所做的操作一样。 

记住,在J2SE中,大多数日期和时间相关的类都包含时间区域信息,包括那些格式类,如java.text.DateFormat, 因此它们都会被JVM的默认时间区域所影响。然而,在你创建这些类的实例时,你能为它们确保正确的时间区域信息,使得你可以更容易来设置整个JVM的默认时间区域。并且一旦设置好,就可以确保所有的这些类都将使用同一个默认的时间区域。 

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航