Android日常开发 - SimpleDateFormat设置时区

Android日常开发 - SimpleDateFormat设置时区

海外项目中由于地区不同,时区也会不同。因为时区的不同,导致相同时间戳转出的日期有所不同,而且相同日期转时间戳也会不同

本文使用SimpleDateFormat进行Date和Str的转换

1、str转Date

//将"2022-05-30 10:00:00"转成Date,设置不同时区看看Date有啥区别
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));   //0时区
System.out.println(simpleDateFormat.parse("2022-05-30 10:00:00").getTime()); //1653904800000
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Europe/Madrid"));  //马德里,对应正二区
System.out.println(simpleDateFormat.parse("2022-05-30 10:00:00").getTime()); //1653897600000
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));  //上海,对应正八区
System.out.println(simpleDateFormat.parse("2022-05-30 10:00:00").getTime());  //1653876000000

根据Date的getTime得出一个结论,str转Date的时候,如果时区增加一时区,Date的时间戳小1小时对应的毫秒值

2、Date转str

//将同一时间戳转成Str,设置不同时区看看Str的区别
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));   //0时区
long time = simpleDateFormat.parse("2022-05-30 10:00:00").getTime(); //1653904800000
System.out.println(simpleDateFormat.format(time)); //2022-05-30 10:00:00
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Europe/Madrid")); //马德里,对应正二区
System.out.println(simpleDateFormat.format(time)); //2022-05-30 12:00:00
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); //上海,对应正八区
System.out.println(simpleDateFormat.format(time)); //2022-05-30 18:00:00

根据最终的Str,得出结论,对于同一时间戳转Str,当设置时区大一时区,得到的Str日期大一小时

3、计算日期对应的时间戳差

一定要注意,根据计算两个年月日格式的日期之间差了多少天的情况。一般情况下,20220531和20220530对应时间戳的差值应该是86400000,也就是一天的毫秒数。在我的程序中,遇到过两个日期对应时间戳差值并不是86400000的整倍数,这样就不能准确的根据86400000算出差了多少天,而结果是一个小数!!!

例如,西班牙2时区,计算20220328和20220327对应时间戳的差值

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.setTimeZone(TimeZone.getTimeZone("Europe/Madrid")); //设置西班牙2时区
Date date1 = sdf.parse("20220328");
Date date2 = sdf.parse("20220327");
long result = date1.getTime() - date2.getTime();
System.out.println(result); //82800000

Excuse me!!!,结果82800000让我在风中凌乱。

其实也没啥影响的!

我遇到的问题,只是一个方法将82800000/86400000的结果转成double并且进一,另一个方法将结果转成int处理,结果就是两个方法得到的值不一致。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值