【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中处理时间的机制有更深入的理解。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
用户的测试机安装的win7,本人用的是 WEBLOGIC8.1 JDK1.4的。 测试时发现时间总是8个小时,郁闷死。 立马想到时区不对,查看控制面板里时区设置(顺便BS一下win7,控制面板就不能学xp有个经典模式吗?郁闷死),发现时区设置正确,看来不是时区设置问题。 在win7下装JDK1.4和JDK1.5、eclipse,输出系统时区和时间。 果然,输出时区为"GMT",时间8小时。那就说明是jdk1.5在win7下取不到正确的时区。 什么原因呢,为了验证我的假设,又下了最新的jdk1.6,后台打印输出正常。 问题找到了,接下来就要解决。为什么xp下能取到时区儿而win7下取不到呢? 搜索一下,到SUN论坛,发现SUN提到了这个bug,(http://java.sun.com/javase/tzupdater_README.html)而且发布了一个tzupdater。 按照使用说明下载、运行,再试,还是不行。 虽然用updater没有成功,但通过他的使用说明还是发现了一些东东。在/jdk1.5.0_04/jre/lib目录下有个tzmappings文件。 用记事本打开,里面记录了所有地区的时区,格式为“China Standard Time:-1,75::Asia/Shanghai:”,看到它,很自然的联想到注册表。 于是,打开注册表时区的节点[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Time Zones/China Standard Time]。 有一个键值似曾相识,“MapID=-1,75”,这不就是tzmappings文件中记录的那个值吗。 会不会Java是通过这个键值获取的时区?展开win7下注册表相同的节点,我靠,里面竟然没有MapID键, 与xp对比了一下,少了MapID、Index键,多了MUI_Display、MUI_Dlt、MUI_Std啥的, 其他的不管,先把MapID键加上再说。加上后,再运行我那个取系统时间的测试程序,OK!问题解决! 本同目录下有两个注册表。一个是中国的 。一个是时区全的。那个都行。 其实本人也是参考CSDN部分帖子,再有疑问联系,CSDN:lawsystem 感谢 CSDN 无名贡献者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值