我们可以查看给定时区的显示名称、ID和时间偏移量,如下所示
TimeZone timeZone = TimeZone.getDefault(); System.out.println(timeZone.getDisplayName()); System.out.println(timeZone.getID()); System.out.println(timeZone.getOffset(System.currentTimeMillis()));以上代码将输出:
中国标准时间 Asia/Shanghai 28800000getOffset() 方法以 int 类型返回该时区在指定日期的 UTC 偏移量(毫秒)。上例中的 28800000 毫秒,也就是 8 h ,我们在东八区(+8)。
在时区之间转换 TimeZone timeZoneCN = TimeZone.getTimeZone("Asia/Shanghai"); TimeZone timeZone0 = TimeZone.getTimeZone("Etc/GMT0"); Calendar calendar = new GregorianCalendar(); calendar.setTimeZone(timeZoneCN); long timeCN = calendar.getTimeInMillis(); System.out.println(calendar.getTimeZone().getDisplayName()); System.out.println("timeCN = " + timeCN); System.out.println("hour = " + calendar.get(Calendar.HOUR_OF_DAY)); calendar.setTimeZone(timeZone0); System.out.println(calendar.getTimeZone().getDisplayName()); long time0 = calendar.getTimeInMillis(); System.out.println("time0 = " + time0); System.out.println("hour = " + calendar.get(Calendar.HOUR_OF_DAY));以上程序将会输出如下:
中国标准时间 timeCN = 1543850448183 hour = 23 格林威治时间 time0 = 1543850448183 hour = 15可以看到,以毫秒为单位的时间在两个时区是相同的,但是已从23点变成15点钟了,因为中国标准时间比格林威治时间快 8 小时,如此,我们设置不同时区获取对应时区的正确时间,这样就实现的换算的目的。
使用 SimpleDateFormat 解析和格式化日期java.text.SimpleDateFormat 类可以解析字符串中的日期,也可以格式化字符串中的日期,本文将展示几个例子:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); String dateString = format.format(new Date()); Date date = format.parse ("2018-12-03");作为参数传递给 SimpleDateFormat 类的字符串是一种模式(模板),用于说明如何解析和格式化日期。 在上面的示例中使用了模式“yyyy-MM-dd”,表示年份 4 位数(yyyy),月份 2 位数(MM)和日期 2 位数(dd)的表示形式,"2018-12-03"中使用‘-’分割是因为在模式中也是用‘-’分割字母的。
以下是常见模式字母列表,具体请看 JavaDoc :
y = year (yy or yyyy) M = month (MM) d = day in month (dd) h = hour (0-12) (hh) H = hour (0-23) (HH) m = minute in hour (mm) s = seconds (ss) S = milliseconds (SSS) z = time zone text (e.g. Pacific Standard Time...) Z = time zone, time offset (e.g. -0800) //一下是一些示例: yyyy-MM-dd HH:mm:ss (2018-12-3 23:59:59) HH:mm:ss.SSS (23:59.59.999) yyyy-MM-dd HH:mm:ss.SSS (2009-12-31 23:59:59.999) yyyy-MM-dd HH:mm:ss.SSS Z (2009-12-31 23:59:59.999 +0100)如果指定 “dd” 来解析new SimpleDateFormat("yyyy-MM-dd");那么天数肯定被表示为 2 位,比如 3 号就是 03。
如果是指定 “d” 来解析new SimpleDateFormat("yyyy-MM-d"); 那么天数优先是 1 位,比如 3 号就是 3, 如果超出 1 位,那会自动扩展为 2 位,比如 13 号,那么就是 13 。
Java .time.Instant 类表示时间线上的一个特定时刻,被定义为自原点起的偏移量,原点是1970年1月1日00点格林,也就是格林尼治时间。 时间以每天 86400 秒为单位,从原点向前移动。
Java.time 这个包是线程安全的,并且和其他大部分类一样,是不可变类。Instant 也不例外。
使用 Instant 类的工厂方法之一创建实例。例如,要创建一个表示当前时刻的时间点,可以调用 instance .now() ,如下所示:
Instant now = Instant.now();Instant 对象包含秒和纳秒,来表示其包含的时间, 自纪元以来的秒数是上完提到的自原点以来的秒数。 纳秒是 Instant 的一部分,不到一秒钟。分别可以通过如下 2 个方法获取:
long getEpochSecond(); int getNano(); Instant 运算Instant类还有几种方法可用于相对于Instant进行计算。 这些方法中的一些(不是全部)是:
plusSeconds()
plusMillis()
plusNanos()
minusSeconds()
minusMillis()
minusNanos()
一个例子如下:
Instant now = Instant.now(); // 现在这一瞬间 Instant later = now.plusSeconds(3); // 3 秒后的瞬间 Instant earlier = now.minusSeconds(3); // 3 秒前的瞬间因为 Instant 是不可变的,所以上面的计算方法,是返回一个代表计算结果的新的 Instant 对象。
Duration 表示时间间隔java.time.Duration 表示两个 Instant 之间的一段时间,Duration 实例是不可变的,因此一旦创建它,就不能更改它的值。但可以基于一个 Duration 对象创建新的 Duration 对象。
创建 Duration 对象可以使用 Duration 类的工厂方法之一创建 Duration 对象,有 between()/ofDays()/ofSeconds()/from() 等方法,但其底层都是调用了同一个构造方法,其源码如下:
private Duration(long seconds, int nanos) { super(); this.seconds = seconds; this.nanos = nanos; }