在Java语言中,您可以通过java.util.Calendar类取得一个本地时间或者指定时区的时间实例。

java.util.Calendar cal = java.util.Calendar.getInstance();//获取本地时间
//java.util.Calendar cal = java.util.Calendar.getInstance(java.util.Locale.CHINA);//指定时区
 
 
 
int zoneOffset = cal.get(java.util.Calendar.ZONE_OFFSET);//获取时间偏移量
int dstOffset = cal.get(java.util.Calendar.DST_OFFSET);//取得夏令时差
cal.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset));//从本地时间扣除时差



 

//所取得的时间即是UTC标准时间。
System.out.println("UTC:"+new Date(cal.getTimeInMillis()));

 

SimpleDateFormat 实例,默认情况下,还使用本地时区。

SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss"); dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));

dateFormatGmt.format(...)

 

示例:

System.out.println("UTC: " +cal.getTime()); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("default: " + format.format(cal.getTime())); format.setTimeZone(TimeZone.getTimeZone("GMT")); System.out.println("GMT: " + format.format(cal.getTime())); format.setTimeZone(TimeZone.getTimeZone("GMT-8")); System.out.println("GMT-8: " + format.format(cal.getTime()));

输出:

UTC: Wed May 03 05:18:34 CST 2017

default: 2017-05-03 05:18:34

GMT: 2017-05-02 21:18:34

 

GMT-8: 2017-05-02 13:18:34

 

备注:毫秒不受时区影响

 

 

JAVA 8:


Java 8日期/时间API是 JSR-310的实现,它的实现目标是克服旧的日期时间实现中所有的缺陷,新的日期/时间API的一些设计原则是:



 



  1. 不变性:新的日期/时间API中,所有的类都是不可变的,这对多线程环境有好处。
  2. 关注点分离:新的API将人可读的日期时间和机器时间(unix timestamp)明确分离,它为日期(Date)、时间(Time)、日期时间(DateTime)、时间戳(unix timestamp)以及时区定义了不同的类。
  3. 清晰:在所有的类中,方法都被明确定义用以完成相同的行为。举个例子,要拿到当前实例我们可以使用now()方法,在所有的类中都定义了format()和parse()方法,而不是像以前那样专门有一个独立的类。为了更好的处理问题,所有的类都使用了工厂模式和策略模式,一旦你使用了其中某个类的方法,与其他类协同工作并不困难。
  4. 实用操作:所有新的日期/时间API类都实现了一系列方法用以完成通用的任务,如:加、减、格式化、解析、从日期/时间中提取单独部分,等等。
  5. 可扩展性:新的日期/时间API是工作在ISO-8601日历系统上的,但我们也可以将其应用在非IOS的日历上。



Java日期/时间API包

不可变的和线程安全的,在绝大多数情况下,这些类能够有效地处理一些公共的需求。

   e.g. LocalDate today = LocalDate.now();// current date

           LocalDate.of(2017, Month.JANUARY, 1);// create date by providing input

LocalDate.now(ZoneId.of("Asia/Kolkata"));// current date in timezone Asia/Kolkata

 

 java.time.LocalTime:LocalTime是一个不可变的类,它的实例代表一个符合人类可读格式的时间,默认格式是hh:mm:ss.zzz。

   e.g.  LocalTime.now();

LocalTime.of(12,20,25,40);// create time by providing input

 java.time.LocalDateTime:LocalDateTime是一个不可变的日期-时间对象,它表示一组日期-时间,默认格式是yyyy-MM-dd-HH-mm-ss.zzz。它提供了一个工厂方法,接收LocalDate和LocalTime输入参数,创建LocalDateTime实例.

   e.g.  LocalDateTime.now();

LocalDateTime.of(LocalDate.now(), LocalTime.now());

 

用在机器可读的时间格式上的,它以Unix时间戳的形式存储日期时间.

e.g. Instant.now();

Instant.ofEpochMilli(Instant.now().toEpochMilli());

java.time.chrono包:这个包为非ISO的日历系统定义了一些泛化的API,我们可以扩展AbstractChronology类来创建自己的日历系统。

java.time.format包:这个包包含能够格式化和解析日期时间对象的类,在绝大多数情况下,我们不应该直接使用它们,因为java.time包中相应的类已经提供了格式化和解析的方法。

java.time.temporal包:这个包包含一些时态对象,我们可以用其找出关于日期/时间对象的某个特定日期或时间,比如说,可以找到某月的第一天或最后一天。你可以非常容易地认出这些方法,因为它们都具有“withXXX”的格式。

 

java.time.zone包:这个包包含支持不同时区以及相关规则的类

 

//utc时间
e.g. ZonedDateTime.now(ZoneOffset.UTC);
//utc时间
e.g. ZonedDateTime.now(ZoneOffset.UTC);