【Java】 时间跟系统时间相差8小时的问题

问题描述

        用Java获取此时时间戳,将时间戳改为Date类型时跟系统时间相差8个小时

分析

        因为Java的Date类在转换时间戳时,默认会按照格林威治时间(GMT)进行计算,而需要的是本地时间。

解决方案

        就是在代码中设置时区即可

一、在取日期以前设置一下时区
TimeZone tz = TimeZone.getTimeZone(“ETC/GMT-8″);
TimeZone.setDefault(tz);
System.out.println("new Date() = " + new Date());
System.out.println("LocalDateTime.now() = " + LocalDateTime.now());
此种方法适用于单次快速获取系统本地时间
二、推荐方式
LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
或者
​LocalDateTime.now(ZoneId.of(ZoneId.SHORT_IDS.get("CTT")));
二、设置java命令参数
java -Duser.timezone=Asia/Shanghai  DateTest
三、设置JVM的默认时区为东八区(北京时间)
在下 面四个目录(bea\jdk142_11\jre\lib\zi\Etc、bea\jdk142_11\jre\lib\zi、bea\jrockit81sp6_142_10\jre\lib\zi\Etc、bea\jrockit81sp6_142_10\jre\lib\zi)下找到GMT文件bak备份 一下,然后复制一份GMT-8并重命名为GMT,复制完毕,重新运行一下java程序问题即可解决!

        

案例

步骤一:获取时间戳

        获取一个时间戳,它是一个表示某个时间的长整型值。可以使用System.currentTimeMillis()方法来获取当前时间的时间戳。

long timestamp = System.currentTimeMillis();

步骤二:创建Date对象

        使用获取到的时间戳来创建一个Date对象。

Date date = new Date(timestamp);

步骤三:设置时区

        默认情况下,Java的Date对象使用的是格林威治时间(GMT)。我们可以通过设置时区来调整为本地时间。

// 获取本地时区
TimeZone timeZone = TimeZone.getDefault();
// 设置Date对象的时区
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(timeZone);
calendar.setTime(date);

步骤四:格式化时间

        最后, 使用SimpleDateFormat类将Date对象格式化为我们需要的时间字符串。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedTime = sdf.format(calendar.getTime());

以上就是解决问题的完整步骤。

下面是完整的代码示例:

import java.util.*;
public class DateConversion {
    public static void main(String[] args) {
        // 获取时间戳
        long timestamp = System.currentTimeMillis();
        // 创建Date对象
        Date date = new Date(timestamp);
        // 获取本地时区
        TimeZone timeZone = TimeZone.getDefault();
        // 设置Date对象的时区
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeZone(timeZone);
        calendar.setTime(date);
        // 格式化时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String formattedTime = sdf.format(calendar.getTime());
        // 输出结果
        System.out.println("Formatted time: " + formattedTime);
    }
}

运行以上代码,你将得到一个正确的本地时间字符串。

总结

        通过以上步骤,我们成功解决了Java中Date根据时间戳转换的时间少了八个小时的问题。我们通过获取时间戳、创建Date对象、设置时区和格式化时间,使得我们能够得到正确的本地时间。

希望这篇文章能帮助你解决这个问题,让你对Java中处理时间的机制有更深入的理解。