java timezone解决夏令时、冬令时问题

1. 方式一:通过IP查询API,获取当地时间

API说明

https://ipinfo.io/{ip}?token={token}
{
    "ip": "91.80.22.206",
    "city": "Rome",
    "region": "Lazio",
    "country": "IT",
    "loc": "41.8626,12.5390",
    "org": "AS30722 Vodafone Italia S.p.A.",
    "postal": "00178",
    "timezone": "Europe/Rome"
}

https://ipinfo.io/103.38.30.114 ?token= fe65864213261b
 网址:https://ipinfo.io/signup 注册账号获取token, 限额每月 50000次查询

后端根据 timezone 获取 当地时间

2.方式二:使用Timezone 时区ID,动态获取当地时间

TimeZone tz = TimeZone.getTimeZone("Europe/Berlin");
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
df.setTimeZone(tz );
String strDate = df.format(new Date());
System.out.println("柏林当前时间:"+strDate);

int rawOffset = tz.getRawOffset(); // 不带令时的与GMT的时差
int offset = tz.getOffset(TimeUtil.GetGreenDate().getTime());// 带时令的与GMT的时差

可通过 offset与rawOffset对比,看当前时区是否属于夏令时、冬令时

boolean b = tz.inDaylightTime(new Date());// 判断当前时间是否处于夏令时

public static Date GetGreenDate(){
        TimeZone gmtTz = TimeZone.getTimeZone("GMT");
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        df.setTimeZone(gmtTz);
        String strDate = df.format(new Date());
        df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date parse = null;
        try {
            parse = df.parse(strDate);
        } catch (ParseException e) {
        }
        return parse;
    }

3.模拟测试:


        断网条件下,java计算"America/New_York" 时区,与UTC时间时差。
        服务器时间2022-01-22,时差:-18000000
        服务器时间2022-04-22(进入夏令时),时差:-14400000

 

结论:

        1.通过更改服务器时间,能模拟时区是否进入夏令时。

        2.java8 timezone内有计算时区是否处于夏令时、冬令时的算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落墨留白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值