Java Calendar计算所在时区的时间偏移量

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

 

你可能感兴趣的:(Java Calendar计算所在时区的时间偏移量)