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处理,结果就是两个方法得到的值不一致。
版权声明:本文为qq_42948831原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。