Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java日期转换为00:00:00.000_Java_Date_Datetime - Fatal编程技术网

java日期转换为00:00:00.000

java日期转换为00:00:00.000,java,date,datetime,Java,Date,Datetime,我有以下格式的日期字符串: 2011/02/14 00:00:00.000 -0800 我通过以下方式将其转换为java日期对象: this.pubDate = Date.parse("yyyy/MM/dd 00:00:00.000 Z", obj.SourcePublishedDate); 上述结果产生于2011/02/14 00:00:00.000+0000 我对结果有两个问题。在解析0时间的情况下,我使用的格式是“yyyy/MM/dd 00:00:00.000 Z”。有没有更好的方法来

我有以下格式的日期字符串:

2011/02/14 00:00:00.000 -0800
我通过以下方式将其转换为java日期对象:

this.pubDate = Date.parse("yyyy/MM/dd 00:00:00.000 Z", obj.SourcePublishedDate);
上述结果产生于2011/02/14 00:00:00.000+0000 我对结果有两个问题。在解析0时间的情况下,我使用的格式是“yyyy/MM/dd 00:00:00.000 Z”。有没有更好的方法来做到这一点,维护0?第二个问题是关于时区的,出于某种原因,我要返回+0000而不是-0800。如何解析正确的值? 非常感谢你的时间

  • java日期不能包含时区信息
  • 如果您必须使用Java7或更低版本。您可以使用Java日历
  • 如果您使用Java8+。您可以使用OffsetDateTime存储日期/时间和时区

    // Parser
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS Z");
    
    // Parse date/time with time zone
    // OffsetDateTime odtWithTime = OffsetDateTime.parse("2011/02/14 00:00:00.000 -0800", formatter);
    OffsetDateTime odtWithTime = OffsetDateTime.parse("2011/02/14 09:30:00.999 -0800", formatter);
    
    // odtWithTime: 2011-02-14T09:30:00.999-08:00
    
    // Remove time from odtWithTime
    LocalDateTime ldtWithoutTime = odtWithTime.toLocalDate().atStartOfDay();
    OffsetDateTime odtWihtoutTime = OffsetDateTime.of(ldtWithoutTime, odtWithTime.getOffset());
    
    // odtWihtoutTime: 2011-02-14T00:00-08:00
    // All time information are reset to Zero
    
  • 摘要:解析日期/时间和时区,然后将所有时间信息重置为零。

    无法将
    0
    指定为文本 试图将
    2011/02/14 00:00:00.000-0800
    之类的字符串解析为日期-时间是一个错误

    首先,您不能使用解析模式
    yyyy/MM/dd 00:00:00.000 Z
    ,因为零没有解析模式代码。字符
    0
    作为代码没有任何意义

    其次,您可能会考虑在时间部分周围添加单引号,例如:
    yyyy/MM/dd'00:00:00.000'Z
    ,以告知格式化程序期望时间值为零的字符串文字。虽然您可以告诉格式化程序需要这样的字符串,但问题是字符串文字在语义上被忽略。因此,现在您没有时间值的输入。如果有日期但没有时间,则无法完成对日期时间的解析。将引发异常

    解决方案:解析为一天中的时间 解决办法是改变你的心态。意识到你可以在一天中的任何时候接收输入,而不一定是所有的零

    请注意:即使您确信您将始终获得一天中第一个时刻的输入,但这并不总是意味着全部为零!在某些时区,一天中的第一个时刻并不总是
    00:00:00.000
    ,这是由于时间或其他异常情况造成的

    因此,只需告诉格式化程序将零解析为一天中的任何有效时间。注意下面示例代码中解析模式中使用的
    HH:mm:ss.SSS

    java.time 我不知道你在问题中提到的
    Date
    课程是什么

    无论如何,您应该使用内置于Java8和更高版本中的框架。看见这些类取代了旧的麻烦的日期时间类,如java.util.date/.Calendar

    特别是,您需要类,因为它代表时间线上某个特定时间的某个时刻。如果你有一个完整的时区,而不仅仅是一个偏移,你会使用

    为了好玩,示例代码还使用了中时间轴上的一个,一个时刻。从概念上讲,
    Instant
    OffsetDateTime
    ZonedDateTime
    的基础

    重要提示:java.time中的解析代码与旧的java.text.simpleDataFormat代码类似,但并不完全相同。一定要仔细阅读文件

    转储到控制台

    System.out.println ( "input: " + input + " | odt: " + odt + " | instant: " + odt.toInstant () );
    
    输入:2011/02/14 00:00:00.000-0800 | odt:2011-02-14T00:00-08:00 |即时:2011-02-14T08:00:00Z


    作为输出生成的字符串默认为标准格式。如果您需要另一种格式,请定义并传递另一种格式。

    什么是
    Date.parse()
    ?这个问题比乍看起来更有趣。一种情况可能是,他们希望日期时间值始终代表一天中的第一个时刻。因此,他们天真地假设一天中的时间总是全零。考虑到这个假设,您可能会直觉地想到硬编码一天中的全零时间。硬编码零不起作用,原因如下所述。更重要的是,我说“天真”,因为一天中的第一刻并不总是
    00:00:00.000
    。总之,很有趣。谢谢你,所以似乎没有办法解析0时间。你是说解析时忽略时间?答案是肯定的。看我更新的答案!
    System.out.println ( "input: " + input + " | odt: " + odt + " | instant: " + odt.toInstant () );