如何在Java中更改日期和时间格式

如何在Java中更改日期和时间格式,java,date,time,Java,Date,Time,我知道这是一个简单的问题,但我应该使用什么日期和时间格式来显示此输出 2019-02-06T3:26:40+08:00 我正在使用java.time。 我使用了LocalDateTime,但它只输出2020-10-06T16:40:04,没有+08:00 我只使用这个: LocalDateTime myObj = LocalDateTime.now(); System.out.println(myObj); 我不知道如何像上面的例子那样格式化。tl;博士 //以UTC的特定偏移量获取当前时间

我知道这是一个简单的问题,但我应该使用什么日期和时间格式来显示此输出

2019-02-06T3:26:40+08:00
我正在使用java.time。 我使用了
LocalDateTime
,但它只输出2020-10-06T16:40:04,没有+08:00

我只使用这个:

LocalDateTime myObj = LocalDateTime.now();
System.out.println(myObj);
我不知道如何像上面的例子那样格式化。

tl;博士
//以UTC的特定偏移量获取当前时间
OffsetDateTime OffsetDateTime=OffsetDateTime.now(小时的区域偏移量(8));
//定义输出模式
字符串模式=“uuu-MM-dd'T'H:MM:ssxxx”;
//并使用已定义模式的格式化程序打印一些结果
System.out.println(“使用模式格式化”
+图案
+ ": " 
+格式(模式(pattern)的DateTimeFormatter.of);
将输出类似于此行的内容(至少时间可能会不同):

格式为uuu-MM-dd'H:MM:ssxxx:2020-10-06T17:02:49+08:00

代码有问题

  • 您的代码示例是在注释中给出的,而不是问题
    (这不是与Java相关的功能问题,但在这里仍然是一个问题,您可以对其进行编辑)

  • 您当前使用的是
    LocalDateTime
    ,它不包含任何有关偏移量或时区的信息

  • 您没有定义所需的输出模式,而是(隐式地)调用
    LocalDateTime
    toString()
    方法,只需在以下代码(注释中的代码)中打印实例即可:


  • LocalDateTime myObj=LocalDateTime.now();
    系统输出打印LN(myObj);
    
    输出一个
    字符串
    2020-10-06T16:40:04
    ,而不输出所需的
    +08:00

    您可以使用
    LocalDateTime
    的实例和所需的
    ZoneOffset
    创建
    OffsetDateTime
    ,如

    LocalDateTime localNow=LocalDateTime.now();
    OffsetDateTime OffsetDateTime=OffsetDateTime.of(localNow,ZoneOffset.of小时(8));
    System.out.println(offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
    
    它还使用预定义的输出模式,该模式与所需模式略有不同(秒与偏移之间显示秒的分数)

    但请注意,在某些情况下,这种方法可能会返回错误的时间点(请参见本答案下方@OleV.V.的评论)。

    如果您确定运行代码的每个系统都有并且将始终具有偏移量为
    +08:00
    的时区设置,则可以使用
    OffsetDateTime.now()
    ,而无需显式添加
    ZoneOffset
    ,也可以通过
    OffsetDateTime nowExplicitSystemOffset=OffsetDateTime.now明确使用系统默认值(ZoneId.systemDefault());

    我建议看一看

    示例输出:

    2020-10-07T20:50:11.758582Z

    抵销日期时间 使用
    OffsetDateTime
    代替
    LocalDateTime

        OffsetDateTime myObj = OffsetDateTime.now(ZoneId.systemDefault());
        System.out.println(myObj);
    
    我刚才在亚洲/香港时区运行了此程序。输出为:

    2020-10-07T03:25:03.254761+08:00

    您要求的格式是ISO 8601。java、time类通常从其
    toString
    方法打印ISO 8601格式。
    LocalDateTime
    对象不包括任何偏移量或时区。
    OffsetDateTime
    ,顾名思义,确实包括UTC偏移量,例如
    +08:00
    ,因此也会打印它来自
    到字符串()

    严格来说,没有必要将
    ZoneId.systemDefault()
    作为参数传递给
    now()
    。如果忽略它,您将得到相同的结果。由于当前时间取决于时区,我总是希望明确说明我使用的时区,因此我和读者都知道我做出了有意识的选择

    链接
    • 解释如何使用java.time

    您使用的是什么日期和时间API?
    java.util
    java.time
    或其他什么?我使用java.time然后准备一个
    DateTimeFormatter
    …哪个类保存您的日期时间值?一个
    OffsetDateTime
    或一个
    ZoneDateTime
    ?请显示一些代码行,例如那些初始化的代码object.LocalDateTime myObj=LocalDateTime.now();System.out.println(myObj);@proxysm04感谢您提供了很多好的额外信息。在问题本身中这样做总比在注释中好(只是这次我为您粘贴了它)。这是正确的一半。它给出的输出类似于
    2020-10-06T17:33:34.597702Z
    ,这是ISO 8601格式,与所要求的格式类似。我猜OP还需要问题示例中给出的
    +08:00
    的偏移量。回答得好!对于未来的访问者:OffsetDateTime.of的替代方案(localNow,ZoneOffset.of Hours(8))可以是
    localNow.atOffset(ZoneOffset.of Hours(8))
    。使用您觉得自然的选项。这里有很好的信息。
    LocalDateTime.now()
    不带参数,后跟
    OffsetDateTime.of(localNow,ZoneOffset.of Hours(8))
    是非常危险的。如果代码恰好在JVM上运行,并且时区设置与预期的+08:00偏移量不一致,那么您将得到一个错误的时间点,而没有任何错误的迹象。请使用例如
    OffsetDateTime.now(ZoneOffset.of Hours(8))
    @OleV.V。这是一个非常有趣的点(我以前没有考虑过)。还有一个很好的答案!<代码>维基百科>代码>链接是非常翔实的,每个人都希望能对日期时间有一个很好的理解。
        OffsetDateTime myObj = OffsetDateTime.now(ZoneId.systemDefault());
        System.out.println(myObj);