我在美国的Ubuntu服务器中运行一个Java应用程序,并配置了CEST时区。

如果我在终端中运行Date命令,它将以CEST Zone时间返回日期-这是完美的。

但是在Java中,如果我运行以下代码

System.out.println (new Date ());

它给了我EDT时间。 我缺少什么配置。

参见stackoverflow.com/questions/3010035/

从控制台中获取的显示中解释日期对象时必须小心,因为它们是使用运行该程序的VM的默认TimeZone格式化的(默认情况下是从OS的时区继承的)。

当然,您可以根据Jesper的回答提供您自己的TimeZone。但是在这样做的同时,我强烈建议您使用IANA时区标识符(例如America / New_York)而不是EST。之所以如此,是因为具有"标准"的缩写未考虑日光节约。

因此,如果仅在控制台上打印日期对象,而没有得到预期的结果,则很有可能将服务器时区设置为错误的值,或者将OS设置为错误的时区。

要更改JVM时区,可以在启动时使用此参数

-Duser.timezone="America/New_York"

tl; dr

世界标准时间:

Instant.now()    // Instantiate an object capturing the current moment in UTC.

.toString()  // Generate a String representing textually that date-time value using standard ISO 8601 format.

2018-03-16T00:57:34.233762Z

分区:

ZonedDateTime.now( ZoneId.of("Africa/Tunis" ) )  // Instantiate an object representing the current moment with a wall-clock time seed by people in a particular region (time zone).

.toString()                                   // Generate a String representing textually that date-time value using standard ISO 8601 format wisely extended to append the name of the time zone in square brackets.

2018-03-16T01:57:34.233762+01:00[Africa/Tunis]

细节

Shailendra的答案是正确的。

另外,在Question中看到的Date类是麻烦的旧日期时间类的一部分,这些类现在已被遗留,完全被java.time类所取代。

java.util.Date的替换为java.time.Instant。 Instant类表示UTC时间轴上的时刻,其分辨率为纳秒(最多十进制的九(9)位数字)。

Instant::toString?始终使用UTC

调用旧类的Date::toString方法时,其作者选择的不幸行为是动态应用JVM的当前默认时区。这不会造成混乱。幸运的是,现代类无需添加任何时区即可说出简单的事实:Instant始终位于UTC中。

Instant.now().toString()

2018-03-16T00:57:34.233762Z

该字符串格式是标准的ISO 8601格式。最后的Z是Zulu的缩写,表示UTC。

CEST Zone time

没有名为CEST的时区。这样的3-4个字母名称是伪区域。它们不是标准化的。它们不是唯一的(!)。而是使用continent/region格式的正确时区。

ZoneId z = ZoneId.of("Europe/Paris" ) ;

您可以通过将ZoneId应用于Instant以获得ZoneDateTime,从UTC调整到这样的时区。

Instant instant = Instant.now() ;

ZonedDateTime zdt = instant.atZone( z ) ;

zdt.toString(): 2018-03-16T01:57:34.233762+01:00[Europe/Paris]

或使用快捷方式ZonedDateTime.now。

ZonedDateTime zdt = ZonedDateTime.now( z ) ;

您也可以将ZonedDateTime调整为另一个时区。注意,java.time使用不可变对象。因此,在调整过程中,我们会基于原始对象得到一个新的独特对象,但又不会干扰原始对象。

ZoneId zNewYork = ZoneId.of("America/New_York" ) ;

ZonedDateTime zdtNewYork = zdt.withZoneSameInstant( zNewYork ) ;

zdtNewYork.toString(): 2018-03-15T20:57:34.233762-04:00[America/New_York]

非常清楚,Instant,zdt和zdtNewYork是三个单独的对象,它们代表时间轴上的同一时刻,同一点。相同的时刻,不同的时钟时间。

I have a Java Application running in my Ubuntu Server in USA and configure CEST Time Zone

仅供参考,一般来说,服务器默认时区的最佳做法是UTC。

更重要的是,服务器操作系统和JVM的当前默认时区应与Java应用程序无关。

不要隐式依赖JVM的当前默认时区,而应始终明确指定所需/期望的时区。如上面的代码所示,将可选的ZoneId参数传递给各种java.time方法。

(顺便说一下,Locale的同上-始终指定所需/预期的语言环境,而不是隐式依赖于当前默认值。)

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧版旧式日期时间类,例如java.util.Date,Calendar和SimpleDateFormat。

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC驱动程序。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

Java SE 8,Java SE 9和更高版本

内置的

标准Java API的一部分,具有捆绑的实现。

Java 9添加了一些次要功能和修复。

Java SE 6和Java SE 7

java.time的许多功能在ThreeTen-Backport中都被反向移植到Java 6和7。

安卓系统

更高版本的Android捆绑了java.time类的实现。

对于早期的Android(<26),ThreeTenABP项目改编了ThreeTen-Backport(如上所述)。请参阅如何使用ThreeTenABP…。

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval,YearWeek,YearQuarter等。

您说服务器配置为位于CEST时区,但是根据Java,默认时区为EDT。 Java从操作系统获取默认时区,因此您的服务器可能未正确设置为CEST。

如果要在特定时区中打印日期,请使用DateFormat并在其上设置时区:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");

df.setTimeZone(TimeZone.getTimeZone("CET"));

System.out.println(df.format(new Date()));

注意:根据我的Java(Java 7u45),CEST不是有效的时区。您是说"英语四级考试"吗? (CEST是CET的夏季变体,但是如果您使用CET,则Java将在适当的时候自动在夏季显示时间)。

java 时区 不正确_Java中的时区不匹配相关推荐

  1. Java中输出时区的缩写_Java中的时区转换小结

    时间加减 Date currentDate = new Date(System.currentTimeMillis()); Calendar cal = Calendar.getInstance(); ...

  2. java包不正确_java中包容易出现的错误及权限问题

    /* 3,权限在不同地方的体现: public protected default private 同一类中: ok ok ok ok 同一包中: ok ok ok 子类中: ok ok 不同包中: ...

  3. 时区 java 巴黎_java中的时区陷阱 - iasuna

    今天碰到一个很奇怪的问题,就是在调用SimpleDateFormat类的parse方法,得到了意外的结果. public static void main(String[] args) throws ...

  4. java 定义整数数组_JAVA中数组的正确定义方法是什么?

    数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来唯一地确定数组中的元素. §5.1一维数组 一.一维数组的定义 type arrayName[]; 其中类型(type)可以为Java中任 ...

  5. instant.now时区不正确_Centos8如何更改时区

    对于许多与系统相关的任务和进程,使用正确的时区是必不可少的.例如,cron守护进程使用系统的时区执行cron作业,日志文件中的时间戳基于同一系统的时区. 环境 Centos8 检查现在的时区 time ...

  6. oracle表的时区怎么查,ORACLE中的时区(time zone)

    oracle对时区的支持比较完美了,有timestamp with time zone和timestamp with local time zone两种数据类型.所谓timestamp with ti ...

  7. java怎么创建日期类_java中的日期类Date

    一.Java中的日期概述 日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题. 在Java中 ...

  8. java a运算顺序_Java中计算顺序的规则是什么?

    噜噜哒 让我说得很清楚,因为人们一直误解这一点:子表达式的求值顺序是独立结合性和优先级..关联性和优先级确定操作者被执行但是不要确定子表达式都是经过评估的.你的问题是关于子表达式都是经过评估的.考虑A ...

  9. java构造器详解_Java中关于构造器的使用详解

    这篇文章主要介绍了Java构造器使用方法及注意事项的相关资料,这里举例说明如何使用构造器及需要注意的地方,需要的朋友可以参考下 Java构造器使用方法及注意事项 超类的构造器在子类的构造器运行之前运行 ...

最新文章

  1. 《用Python进行自然语言处理》第7章 从文本提取信息
  2. Atitit.js模块化 atiImport 的新特性javascript import
  3. (二)操作系统设计技术知识重点笔记
  4. 优秀项目经理必备的8个要素
  5. mysql查询缓存到redis_php查询mysql并缓存到redis
  6. 支付宝研究员兼OceanBase总架构师杨传辉:我在数据库梦之队的十年成长路
  7. Java使用正则表达式抓取日期和访问量
  8. Javascript 中调参数的脚本onclick=select(this) this 怎么解释
  9. [软广]某数据领域在线教育机构
  10. c语言二级编程题库,计算机二级C语言编程题库(100题)
  11. H5 video 播放器demo代码
  12. 对抗机器学习论文-BackdoorBench: A Comprehensive Benchmark of Backdoor Learning
  13. 计算机讲Word文档中的组合,电脑Word文档中两个表格如何合并
  14. 分层图解决的一些最短路问题
  15. android设置状态栏字体颜色vivo,状态栏通知图标颜色统一_vivo Xplay3S_手机Android频道-中关村在线...
  16. 编写一个静态方法lg(),接收一个整型参数N,返回不大于log2N(以2为底)的最大整数。不要使用Math库。
  17. 微信小程序第三方框架
  18. < 性能提升 Get √ :如何理解 “ 回流 ” 与 “ 重绘 ” ?如何合理的减少其出现呢 ? >
  19. Appium启动应用时,报错提示adb执行超时的问题解决
  20. Oracle Linux 6.4(BOND)双网卡绑定实战—附加说明

热门文章

  1. qmake:变量手册
  2. rollbackFailedOptional: verb npm-session 64fdf3659ff8cc5a
  3. MySQL数据库文件转化为Word表格做论文/报告
  4. $oracle什么意思,oracle惯用缩写的含义
  5. CatBoost 模型中标称型特征转换成数字型特征
  6. aspx文件怎么用服务器打开,高手教你轻松打开ASPX文件【图文教程】
  7. vue 使用Blob实现下载xls文件
  8. C Primer Plus 第3章 数据和C-编程练习
  9. WPF TextBlock自定义内容_se7en3_新浪博客
  10. Ubuntu 16.04 安装 vivado2018.3