Android日常开发 – SimpleDateFormat设置时区

  • Post author:
  • Post category:其他




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 版权协议,转载请附上原文出处链接和本声明。