栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android-时区时间戳转换及遇到的坑

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android-时区时间戳转换及遇到的坑

文章目录
  • 1.背景
  • 2.修改方案
  • 3.实现步骤
  • 4.遇到的坑
  • 5.完整代码

1.背景

台北时区下,用户在客户端填写生日1979/08/01,客户端将1979/08/01 00:00:00(台北时区)转化为时间戳传给后端,后端在存储时,需解析出月份并单独保存到一个字段,用于生日券发放。接口在解析时用到北京时区,解析出的时间为1979/07/31 23:00:00(北京时区),所以该用户的月份字段值为7,得到了七月份生日券。

2.修改方案

取客户选择的日期+00:00:00(0时区),将该时间转化为时间戳传给后端,这样后端转化时,不会再出现日期不一致的情况。

3.实现步骤
 		Date date = new Date(); //模拟用户填写的日期
        Calendar cd = Calendar.getInstance();
        cd.setTime(date);
        cd.setTimeZone(TimeZone.getTimeZone("UTC")); //设置时区

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        
        //获取年月日,重置时分秒
        cd.set(cd.get(Calendar.YEAR), cd.get(Calendar.MONTH), cd.get(Calendar.DATE), 0, 0, 0);
        System.out.println(simpleDateFormat.format(cd.getTimeInMillis()));  //输出2022-07-13 00:00:00
        System.out.println(cd.getTimeInMillis());  //输出1657670400490
        
4.遇到的坑
		System.out.println(simpleDateFormat.format(cd.getTimeInMillis()));  //输出2022-07-13 00:00:00
		System.out.println(cd.getTimeInMillis());  //输出1657670400490

此时转换后得到的时间戳存在毫秒级的误差 1657670400490

添加以下

		cd.set(Calendar.MILLISECOND, 0); //单独设置毫秒,避免误差

得到

    	System.out.println(simpleDateFormat.format(cd.getTimeInMillis())); //2022-07-13 00:00:00
    	System.out.println(cd.getTimeInMillis()); //输出1657670400000

5.完整代码

Java

		Date date = new Date(); //模拟用户填写的日期
        Calendar cd = Calendar.getInstance();
        cd.setTime(date);
        cd.setTimeZone(TimeZone.getTimeZone("UTC")); //设置时区

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

        //获取年月日,重置时分秒
        cd.set(cd.get(Calendar.YEAR), cd.get(Calendar.MONTH), cd.get(Calendar.DATE), 0, 0, 0);
        cd.set(Calendar.MILLISECOND, 0); //单独设置毫秒,避免误差

        System.out.println(simpleDateFormat.format(cd.getTimeInMillis())); //2022-07-13 00:00:00
        System.out.println(cd.getTimeInMillis()); //输出1657670400000

Kotlin

		val date = Date()
        val cd = Calendar.getInstance()
        cd.time = date
        cd.timeZone = TimeZone.getTimeZone("UTC")
        cd[cd[Calendar.YEAR], cd[Calendar.MONTH], cd[Calendar.DATE], 0, 0] = 0
        cd[Calendar.MILLISECOND] = 0 //单独设置,避免毫秒级的误差
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1013110.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号