Java 时间戳取当天零点问题,一文弄懂计算机内的时区(东八区和标准时区)
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,也就是我目前在的时区的时间。
本地时钟
运行结果
本文来自博客园,作者:HumorChen99,转载请注明原文链接:https://www.cnblogs.com/HumorChen/p/18039643