当前位置 : 主页 > 编程语言 > java >

java new Date()获得的系统时间与操作系统的时间不一致

来源:互联网 收集:自由互联 发布时间:2021-06-28
java new Date()获得的系统时间与操作系统的时间不一致(差8小时) 问题:1.new Date() 得到的时间和系统相差 相差8个小时2.eclipse 控制台打印的时间与系统相差 相差8个小时3.log4j日志的时间
java new Date()获得的系统时间与操作系统的时间不一致(差8小时)
问题:
1.new Date() 得到的时间和系统相差 相差8个小时
2.eclipse 控制台打印的时间与系统相差 相差8个小时
3.log4j日志的时间与与系统相差 相差8个小时
上述问题其实是同一个问题。

造成这种问题的原因可能是:操作系统时区和JVM的时区不一致。(new Date()获取的是JVM的时区,看到的是操作系统时区。)
有时候JVM的new java.util.Date()得到的是格林威治时间(也就是0时区),我们的北京时间比它晚8个小时,因为北京在东八区。
例如:在一个精简的Linux安装上jre,发现所有的java程序获取的时间都不是系统时间。后来发现原来是时区不对。
java程序获取的时间都是GMT时间,而系统是北京时间,应该是GMT+8,刚好相差8小时。

解决:
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
//df.setTimeZone(TimeZone.getTimeZone("GMT+8"));
df.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
System.out.println(df.format(new Date()));// new Date()为获取当前系统时间
        添加一行df.setTimeZone(TimeZone.getTimeZone("GMT+8"));或df.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));均可



--------------------------------------------------------------------以下来源百度 111--------------------------------------------------------------------------------------------------------
通过java语句获得系统时间,用
Date d = new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd kk:mm:ss ");
System.out.println(sdf.format(d));
或者:
    Calendar now = Calendar.getInstance();
    System.out.println(now.get(Calendar.HOUR_OF_DAY));
    System.out.println(now.get(Calendar.MINUTE));
    System.out.println(now.get(Calendar.SECOND));
取 得的时间总是比系统时间少8个小时,获得的总是格林尼治时间(0时区的时间),检查系统时间确实是正确的,时区为GMT+8:00北京……等;可能是系统时间注册表出现问题,这里就不修改注册表了。这时 MyEclipse或Java默认的时间时区是0时区,所以:
考虑到代码的可移植性,在用到时间的地方都初始化当前的时区;加上代码:
setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
修改如下:
Date d = new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd kk:mm:ss ");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
System.out.println(sdf.format(d));
或者:
    Calendar now = Calendar.getInstance();
    now.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));//important
    System.out.println(now.get(Calendar.HOUR_OF_DAY));
    System.out.println(now.get(Calendar.MINUTE));
    System.out.println(now.get(Calendar.SECOND));
这样就可以了。
===========================================================================================
针对这一问题之前说过在系统代码用到时间时可以在时间初始化前加上以下一句话,但是这样比较麻烦,因此,在安装Java的JDK之后,可以替换几个源文件以达到相同的目的。
setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
另一种方法:
找到Java目录下的
依次: jdk1.60\jre\lib\zi\Etc
      jdk1.60\jre\lib\zi
      java\jre1.6.0_14\jre\lib\zi\Etc
      java\jre1.6.0_14\jre\lib\zi
下找到GMT文件,删除之(可以备份一下,以防万一),然后复制一份GMT-8并重命名为GMT替换原来的GMT。这样,就达到了掩人耳目的目的。试一下,可以解决!






------------------------------------------------------以下来源百度 222--------------------------------------------------------------------------------------------------------
设置默认时区:
  TimeZone tz =TimeZone.getTimeZone("Asia/Shanghai");
  TimeZone.setDefault(tz);
  Date date=new Date();
  String str=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
  System.out.println(str);
  
  设置时间格式的时区:
  SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd kk:mm:ss ");
  sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
  Date d = new Date();
  System.out.println(sdf.format(d));
  设置日历的时区:
  Calendar now = Calendar.getInstance();
  now.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));//important
  System.out.println(now.get(Calendar.YEAR));
  System.out.println(now.get(Calendar.MONTH));
  System.out.println(now.get(Calendar.DAY_OF_MONTH));
  System.out.println(now.get(Calendar.HOUR_OF_DAY));
设置时间格式的时区:
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
  formatter.setTimeZone(TimeZone.getTimeZone("GMT+8"));
  Date currTime = new Date();
  String thisTime = new String(formatter.format(currTime));
  System.out.println("GMT+8:"+thisTime);
  系统时区:
  String tzId = TimeZone.getDefault().getID();  
  System.out.println("TimeZone.getDefault().getID():"+tzId);
系统时区:
  String zone = System.getProperty("user.timezone");
  System.out.println("user.timezone:"+zone);
上一篇:拼音排序
下一篇:angular-cli 错误
网友评论