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