1、通过Calendar对象,根据系统时间计算时区偏移量、夏令时时间
System.out.println("当前时间:"+new Date());
// Calendar.getInstance() 获取Calendar实例,并获取系统默认的TimeZone
Calendar calendar = Calendar.getInstance();
System.out.println("Calendar的系统默认TimeZone ID:" +
calendar.getTimeZone().getID());
// 指定时区,例如意大利的罗马时区:Europe/Rome
// 罗马时区属于东1区,也就是UTC+1或GMT+1
TimeZone itTimeZone = TimeZone.getTimeZone("Europe/Rome");
// Calendar指定罗马时区
calendar.setTimeZone(itTimeZone);
System.out.println("Calendar指定TimeZone ID:" + itTimeZone.getID());
// 夏令时时间,比标准时间快1小时,即3600000毫秒,
// 根据系统时间计算,如果不在夏令时生效范围内,则为0毫秒,反之为3600000毫秒
int dstOffset = calendar.get(Calendar.DST_OFFSET);
// 取得与GMT之间的时间偏移量,例如罗马属于东1区,则时间偏移量为3600000毫秒
int zoneOffset = calendar.get(Calendar.ZONE_OFFSET);
System.out.println("夏令时时间:"+dstOffset);
System.out.println("时间偏移量:"+zoneOffset);
执行结果:
# 非夏令时
当前时间:Tue Jan 01 15:48:11 CST 2019
Calendar的系统默认TimeZone ID:Asia/Shanghai
Calendar指定TimeZone ID:Europe/Rome
夏令时时间:0
时间偏移量:3600000
# 夏令时
当前时间:Sat Jun 01 15:52:43 CST 2019
Calendar的系统默认TimeZone ID:Asia/Shanghai
Calendar指定TimeZone ID:Europe/Rome
夏令时时间:3600000
时间偏移量:3600000
2、通过Calendar对象,根据指定时间计算时区偏移量、夏令时时间。
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = dateFormat.parse("2019-01-12 00:00:00");
System.out.println("当前时间:"+ dateFormat.format(date));
// Calendar.getInstance() 获取Calendar实例,并获取系统默认的TimeZone
Calendar calendar = Calendar.getInstance();
System.out.println("Calendar的系统默认TimeZone ID:" +
calendar.getTimeZone().getID());
System.out.println("Calendar的默认时间:" +
dateFormat.format(calendar.getTime()));
// 指定时区,例如意大利的罗马时区:Europe/Rome
// 罗马时区属于东1区,也就是UTC+1或GMT+1
TimeZone itTimeZone = TimeZone.getTimeZone("Europe/Rome");
// Calendar指定罗马时区
calendar.setTimeZone(itTimeZone);
System.out.println("Calendar指定TimeZone ID:" + itTimeZone.getID());
// 指定时间
calendar.setTime(date);
System.out.println("Calendar指定时间:" + dateFormat.format(calendar.getTime()));
// 夏令时时间,比标准时间快1小时,即3600000毫秒,
// 根据系统时间计算,如果不在夏令时生效范围内,则为0毫秒,反之为3600000毫秒
int dstOffset = calendar.get(Calendar.DST_OFFSET);
// 取得与GMT之间的时间偏移量,例如罗马属于东1区,则时间偏移量为3600000毫秒
int zoneOffset = calendar.get(Calendar.ZONE_OFFSET);
System.out.println("夏令时时间:"+dstOffset);
System.out.println("时间偏移量:"+zoneOffset);
执行结果:
# 非夏令时
当前时间:2019-01-12 00:00:00
Calendar的系统默认TimeZone ID:Asia/Shanghai
Calendar的默认时间:2019-06-01 15:58:11
Calendar指定TimeZone ID:Europe/Rome
Calendar指定时间:2019-01-12 00:00:00
夏令时时间:0
时间偏移量:3600000
# 夏令时
当前时间:2019-04-12 00:00:00
Calendar的系统默认TimeZone ID:Asia/Shanghai
Calendar的默认时间:2019-06-01 16:00:13
Calendar指定TimeZone ID:Europe/Rome
Calendar指定时间:2019-04-12 00:00:00
夏令时时间:3600000
时间偏移量:3600000