注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

拥有自己的梦想,跟随心的召唤

平凡是福

 
 
 

日志

 
 

Java Date / Time  

2015-12-30 11:36:47|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一)关于时间
1)UTC 协调世界时 (Coordinated Universal Time)
又称世界统一时间,世界标准时间,国际协调时间。以原子时秒长为基础。而UTC是基于标准的GMT提供的准确时间。在不需要精确到秒的情况下,通常也将GMT 和UTC 视作等同。如果本地时间比UTC时间快,例如中国大陆[3]、香港、澳门、台湾、蒙古国、新加坡、马来西亚、菲律宾、澳大利亚西部的时间比UTC快8小时,就会写作UTC+8,俗称东8区。相反,如果本地时间比UTC时间慢,例如夏威夷的时间比UTC时间慢10小时,就会写作UTC-10,俗称西10区。
UTC + 时区差 = 本地时间,如 UTC + (+0800) = 北京时间
UTC使用24小时制,如 01:00 am的UTC时间表示为 0100(或0100z、0100Zulu),北京时间(UTC+8)18:20的UTC时间则为 1020 (1820-0800)。
2)UT 世界时 (Universal Time)
即格林尼治时间,格林尼治所在地的标准时间。以地球自转为基础的时间计量系统。
3)GMT 格林尼治标准时 (Greenwich Mean Time)
是指位于伦敦郊区的皇家格林尼治天文台的标准时间。自1924年2月5日开始,格林尼治天文台每隔一小时会向全世界发放调时信息。
4)TAI 国际原子时
采用基于铯原子(Cs 132.9)的能级跃迁原子秒作为时标。TAI是1971年由国际时间局建立,现改为国际计量局(BIPM)的时间部门在维持,根据全球约60个实验室中的大约240台自由运转的原子钟提供的数据进行处理,得出“国际时间标准”称为国际原子时(TAI)。
5)CST(北京时间)
北京时间,China Standard Time,中国标准时间。在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8。
不过这个CST这个缩写比较纠结的是它可以同时代表四个不同的时间:
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
6)国际标准 ISO 8601 - 日期和时间的表示方法 (2004-12-01第三版PDF)
全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》。目前是第三版ISO8601:2004以替代第一版ISO8601:1988与第二版ISO8601:2000。
》日期和时间的表示法:(ISO8601:1998)
  YYYY = four-digit year
  MM   = two-digit month (01=January, etc.)
  DD   = two-digit day of month (01 through 31)
  hh   = two digits of hour (00 through 23) (am/pm NOT allowed)
  mm   = two digits of minute (00 through 59)
  ss   = two digits of second (00 through 59)
  s    = one or more digits representing a decimal fraction of a second
  TZD  = time zone designator (Z or +hh:mm or -hh:mm)
  如:
  YYYY (eg 1997)
  YYYY-MM (eg 1997-07)
  YYYY-MM-DD (eg 1997-07-16)
  YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
  YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
  YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00)
 2015-02-01北京时间18:10表示为2015-02-01T18:10+08:00,对应的UTC时间为2015-02-01T10:10Z,
 可以简写为20150201T1810+08、20150201T1010Z
 年由4位数组成,以公历公元1年为0001年,以公元前1年为0000年,公元前2年为-0001年,其他以此类推。
》日历星期和日表示法 YYYY[-]Waa[[-]b]
aa - 2位数表示年内第几个日历星期,该年度的1月1日如果是星期一、星期二、星期三或星期四的话,该星期就是该年的第一个星期,也就是W01。 该年度的1月1日如果是星期五、星期六或星期日的话,该星就是前一年的最后一个星期。 
b   - 一位数表示日历星期内第几天,从星期一开始,星期日为第7天
如:
2004年5月3日2004-W19-1或2004W191
2004年第一周2004-W01
2004年1月1日(周四)2004-W01-4
2005年1月1日(周六)是2004-W53-6,2005年1月3日是2005-W01-1。
午夜,一日的开始:完全表示为000000或00:00:00;仅有小时和分表示为0000或00:00
午夜,一日的终止:完全表示为240000或24:00:00;仅有小时和分表示为2400或24:00
》顺序日期表示法
将一年内的天的序数用3位数字表示,平年365天,闰年366天。如2004年5月3日可以表示为2004-124或2004124
》时间段表示法
表示某一作为一段时间间隔,前面加一大写字母P,但时间段后都要加上相应的代表时间的大写字母。如在一年三个月五天六小时七分三十秒内,可以写成P1Y3M5DT6H7M30S。
》时间间隔表示法
从一个时间开始到另一个时间结束,或者从一个时间开始持续一个时间间隔,要在前后两个时间(或时间间隔)之间放置斜线符"/"。格式为:
<start>/<end>
<start>/<duration>
<duration>/<end>
<duration>
例如19850412/19860101,19850412/P6M
》循环时间表示法
前面加上一大写字母R,格式为:
R[循环次数][/开始时间]/时间间隔[/结束时间]
如要从2004年5月6日北京时间下午1点起时间间隔半年零5天3小时循环,且循环3次,可以表示为R3/20040506T130000+08/P0Y6M5DT3H0M0S。
如以1年2个月为循环间隔,无限次循环,最后循环终止于2025年1月1日,可表示为R/P1Y2M/20250101

Java日期/时间API包含以下相应的包。
  1. java.time包:这是新的Java日期/时间API的基础包,所有的主要基础类都是这个包的一部分,如:LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration等等。所有这些类都是不可变的和线程安全的,在绝大多数情况下,这些类能够有效地处理一些公共的需求。
  2. java.time.chrono包:这个包为非ISO的日历系统定义了一些泛化的API,我们可以扩展AbstractChronology类来创建自己的日历系统。
  3. java.time.format包:这个包包含能够格式化和解析日期时间对象的类,在绝大多数情况下,我们不应该直接使用它们,因为java.time包中相应的类已经提供了格式化和解析的方法。
  4. java.time.temporal包:这个包包含一些时态对象,我们可以用其找出关于日期/时间对象的某个特定日期或时间,比如说,可以找到某月的第一天或最后一天。你可以非常容易地认出这些方法,因为它们都具有“withXXX”的格式。
  5. java.time.zone包:这个包包含支持不同时区以及相关规则的类。
// java.util.Date、java.util.Calendar to java.time.Instant
Instant time = Calendar.getInstance().toInstant();
Instant time = new Date().toInstant();
Date dt = Date.from(Instant.now());
long millis = Instant.now().toEpochMilli();

// java.time.Instant to java.time.LocalDateTime
LocalDateTime dt= LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());

// java.time.LocalDate to java.sql.Date
java.sql.Date#valueOf(java.time.LocalDate)

// java.time.LocalDate to java.util.Date
Date date = java.util.Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Date date = java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

// java.util.Date to java.time.LocalDate
LocalDate.from(Instant.ofEpochMilli(java.util.Date#getTime()));
java.util.Date#toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

// format
LocalDateTime dateTime = LocalDateTime.now();
dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
dateTime.format(DateTimeFormatter.BASIC_ISO_DATE);

// parse
LocalDateTime dt = LocalDateTime.parse("2015-01-01 20:30:30", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

)joda-time 2.8+
String src = "2015-02-01 20:05:01.987+08:00";
DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSSZZ");
DateTime dt = f.parseDateTime(src);
Assert.assertEquals(src, f.print(dt));
2)日期计算
DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd");
加1天:Assert.assertEquals("2015-02-01",  f.print(new LocalDate(2015,1,31).plusDays(1)))
3)获取毫秒值
long org.joda.time.DateTimeUtils#getInstantMillis(ReadableInstant instant)


参考:
w3c: Date and Time Formats (ISO 8601)
  评论这张
 
阅读(410)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017