Java 时间戳取当天零点问题,一文弄懂计算机内的时区(东八区和标准时区)

Java 时间戳取当天零点问题,一文弄懂计算机内的时区(东八区和标准时区)
Java 时间戳取当天0点问题,一文弄懂计算机内的时区(东八区和标准时区)
我们一般使用中国/上海时间,处于东八区 +8H

在这里插入图片描述

按国内东八区获取国内的0点整时间戳

原因分析

我们处于东+8时区,我们直接拿时间拿到的是linux时间戳,数值是按UTC标准时间来的时间戳,显示的时候按照我们东八区显示,要到我们本地就要加8小时,再进去运算,在我们时区内算完了再减掉8小时,让时间戳回UTC时间,这样我们的时间戳打印出来就是0点

解决办法


import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class Test {
    public static void main(String[] argss) {
        long now = System.currentTimeMillis();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        TimeZone timeZone = simpleDateFormat.getTimeZone();
        System.out.println("我电脑本地的时区ID:"+timeZone.getID());
        System.out.println("我电脑本地的时间名字:"+timeZone.getDisplayName());
        System.out.println("我电脑本地的时区的偏移量:"+timeZone.getRawOffset());
        long hour = 1000*60*60;
        long offsetHour = timeZone.getRawOffset()/hour;
        System.out.println("我电脑本地的时区的偏移量的小时数:"+(offsetHour > 0 ? "+":"")+offsetHour+" 小时");
        System.out.println("现在的时间:"+simpleDateFormat.format(new Date(now)));
        long eightHour = 1000*60*60*8;
        long oneDay = eightHour * 3;
        //加8小时,到我们+8h时区来运算
        now = now + eightHour;
        //进行取余运算
        now = now - now%oneDay;
        //算完之后减掉8小时,让时间戳回utc标准时区
        now = now - eightHour;
        //打印的时候按本地时间打印
        System.out.println("零点的时间:"+simpleDateFormat.format(new Date(now)));
    }

}

本地时钟

我本地电脑windows时钟显示的是东八区的时间,也是下午五点多

在这里插入图片描述

运行结果

在这里插入图片描述

按标准时区获取标准时区的0点整时间戳

原因分析

我们处于东+8时区,我们直接拿时间拿到的是linux时间戳,数值是按UTC标准时间来的时间戳,显示的时候也是要按标准时区来显示,那么我们直接减去取余部分即可完成计算。

解决办法

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class Test {
    public static void main(String[] argss) {
        long now = System.currentTimeMillis();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        TimeZone timeZone = simpleDateFormat.getTimeZone();
        System.out.println("标准时区ID:"+timeZone.getID());
        System.out.println("标准时区名字:"+timeZone.getDisplayName());
        System.out.println("标准时区的偏移量:"+timeZone.getRawOffset());
        long hour = 1000*60*60;
        long offsetHour = timeZone.getRawOffset()/hour;
        System.out.println("标准时区的偏移量的小时数:"+(offsetHour > 0 ? "+":"")+offsetHour+" 小时");
        System.out.println("现在的时间:"+simpleDateFormat.format(new Date(now)));
        long eightHour = 1000*60*60*8;
        long oneDay = eightHour * 3;
        //可以直接进行取余运算
        now = now - now%oneDay;
        //打印的时候按标准时区时间打印
        System.out.println("零点的时间:"+simpleDateFormat.format(new Date(now)));
    }

}

我电脑目前是五点多,接近六点了,我们看下面截图里utc时间是早上9.56,我们试着加8小时,你会发现就等于下午5.56,也就是我目前在的时区的时间。

本地时钟

在这里插入图片描述

运行结果

在这里插入图片描述

posted @ 2021-04-02 17:14  HumorChen99  阅读(55)  评论(0编辑  收藏  举报  来源