当前位置: 首页 > 知识库问答 >
问题:

了解Java util日期

彭兴朝
2023-03-14

为什么java。util。日期对象显示日期

在docs中,还有一个java。util。Date实例没有时区的概念。

如果是这样,为什么这个片段打印日期指定时区。

public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date);
    } 

输出:2017年3月22日星期三14:58:56

为什么它在输出中显示特定的时区?我理解SOP在内部实现了toString()。toString()会影响时区吗?

共有3个答案

夹谷承安
2023-03-14

它确实有时区的概念,但总是UTC。因此,当它打印日期时,将其转换为计算机的时区没有问题。

秦俊发
2023-03-14

UTC当前时刻。

Instant.now()    // Capture current moment in UTC.
    .toString()  // Generate String in standard ISO 8601 format.

2018-01-23T01:23:45.677340Z

印度时区的当前时刻。

ZonedDateTime.now( 
    ZoneId.of( "Asia/Kolkata" ) 
).toString()    // Generate string in format wisely extended from ISO 8601 standard, adding the time zone name in square brackets.

2018-01-23T06:53:45.677340 05:30[Asia/Kolkata]

为什么java。util。日期对象显示日期

因为java.util.Date和相关的类(日历SimpleDateFormata等等)设计得很差。虽然在处理日期-时间处理这个棘手的问题上做了勇敢的努力,但它们没有达到目标。它们充满了糟糕的设计选择。你应该避免它们,因为它们现在被java.time类取代了,这是一个巨大的进步。

特别要回答您的问题:DatetoString方法在生成String时动态应用JVM的当前默认时区。因此,虽然Date对象本身表示UTC中的某个时刻,但toString会产生错误的印象,即它携带显示的时区。

更糟糕的是,Date对象中隐藏着一个时区。该区域在内部使用,但与我们这里的讨论无关。令人困惑是的,还有另一个避免上这门课的原因。

爪哇。util。Date实例没有时区的概念。

不是真的。日期代表一个特定的时刻,时间线上的一个点,分辨率为毫秒,以UTC为单位。正如您所提到的,它被定义为自UTC 1970年第一个时刻以来的毫秒计数。

爪哇。时间类别明确区分UTC、分区和非分区值的概念。

java。时间Instant类表示UTC时间线上的一个时刻,分辨率为纳秒(最多九(9)位小数)。这个类取代了java。util。日期

Instant instant = Instant.now() ;  // Capture current moment in UTC.

将时区(ZoneId对象)应用于即时对象,您将获得一个ZoneDateTime对象。该类取代了java。util。日历class。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;  // Same simultaneous moment as `instant`, but different wall-clock time.

如果一个值只有UTC的偏移量,但没有完整的时区,请使用OffsetDateTime类。

对于仅限日期、不含时间和时区的情况,请使用LocalDate类。这个类取代了java。sql。日期课程。同样适用于LocalTime替换java。sql。时间

LocalDate xmasDate2018 = LocalDate.of( 2018 , Month.DECEMBER , 25 ) ;

如果区域或偏移量未知或不确定,例如“圣诞节在2018年12月25日午夜钟声响起时开始”,请使用LocalDateTime类。此类不表示实际时刻,即时间线上的特定点。此类缺乏时区或偏移量的任何概念。因此,它只能表示大约26-27小时范围内的潜在时刻。

LocalDateTime xmasEverywhere2018 = LocalDateTime.of( xmasDate2018 , LocalTime.MIN ) ;

或者…

LocalDateTime xmasEverywhere2018 = LocalDateTime.of( 2018 , Month.DECEMBER , 25 , 0 , 0 , 0 , 0 ) ;

爪哇。时间框架内置于Java8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,比如java。util。日期日历

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

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR 310。

使用符合JDBC 4.2或更高版本的JDBC驱动程序,您可以交换java。时间对象直接与数据库连接。不需要字符串或java。sql.*上课。

在哪里可以获得java。时间课?

  • JavaSE8、JavaSE9及更高版本
    • 内置的
    • 标准Java API的一部分,带有捆绑实现
    • Java9增加了一些小功能和修复
    • java.time的大部分功能被反向移植到Java6
    • 更高版本的Android捆绑包实现了java。时间课

    Three10-Extra项目通过附加类扩展java.time。该项目是未来可能添加到java.time.的试验场。您可以在这里找到一些有用的类,如IntervalYearZacksYearQuter等。

祝俊雄
2023-03-14

只要按照javadoc,因为它说:

公共字符串toString()

将此Date对象转换为表单的String:

Dowmon dd hh: mm: ss zzz yyyy

zzz是时区(可能反映夏令时)。

当你深入了解源代码时,这个toString()实现会在某个时候使用时区。getDefault()(确切地说是getDefaultRef())。换句话说:默认实现会引入JVM的“默认”时区。

 类似资料:
  • Java中的UUID是否像字符串一样内嵌?如果不是,我是否应该尝试回收UUID对象以最大限度地减少RAM使用? 我使用UUID作为数据库主键的数据类型 因此,当从数据库检索行时,我是否应该检查每个UUID是否重复,如果重复,是否使用原始对象引用?或者这已经代表我做了,类似于字符串的内部处理方式?

  • 问题内容: 我想了解ES如何在其索引内部存储日期值。可以转换为UTC吗? 我有一个日期类型的字段“ t”。这是映射: 现在,当我向ES插入/添加文档时,它如何存储在索引中。 “ t”:“ 1427700477165”(从Date.now()函数生成的毫秒数)。ES是否在UTC中识别其时代时间并按原样存储? “ t”:“ 2015-03-29T23:59:59”(我会相应地调整映射日期格式)-ES如

  • 但是,在日志配置的xml文件中,冒号后面总是有一个破折号。这是为什么?例如: ” 2.不断变化的财产名称 特别是,此属性在application.properties(或.yml)中没有等价属性来配置它 ${log_file_total_size_cap:-0} 如果要将该属性更改为其他值,则必须设置LOG_FILE_TOTAL_SIZE_CAP属性。我如何在仍然使用spring Boot提供的原

  • 本文向大家介绍javascript类型系统——日期Date对象全面了解,包括了javascript类型系统——日期Date对象全面了解的使用技巧和注意事项,需要的朋友参考一下 前面的话 Date对象是javascript语言中内置的数据类型,用于提供日期和时间的操作接口。Date对象是在早期java中的java.util.Date类基础上创建的,为此,Date类型使用自UTC1970年1月1日0点

  • 本文向大家介绍简单了解Java日志脱敏框架sensitive,包括了简单了解Java日志脱敏框架sensitive的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了简单了解Java日志脱敏框架sensitive,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题 为了保证用户的信息安全,敏感信息需要脱敏。 项目开发过程中,每次处理敏感信

  • 我的应用程序运行在weblogic服务器上,在那里我配置了一个JNDI数据源来获取数据库连接。我试图理解weblogic服务器生成的数据源日志。 路径: 日志内容: 看起来有一个错误信息,但我无法理解为什么数据源会给出错误。请帮助我理解这一点。