Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
在Java8中为日期和时间戳使用replaceAll函数_Java_Date_Java 8_Timestamp_Utc - Fatal编程技术网

在Java8中为日期和时间戳使用replaceAll函数

在Java8中为日期和时间戳使用replaceAll函数,java,date,java-8,timestamp,utc,Java,Date,Java 8,Timestamp,Utc,我想在末尾将日期和时间戳的两个不同输入设置为UTC格式的日期。我不确定使用replaceAll功能是否有效 投入: 字符串日期=“06/04/2019”,格式为“MM/dd/yyyy” 字符串timestamp=“15/03/2018 15:46:59.000386 PM-05:00”格式为 是“dd/MM/yyyy hh:MM:ss.ssss a XXX” 输出: “06/04/2019 15:46:59.000386 PM-05:00”然后将其转换为UTC…执行人员回答:否,字符串。re

我想在末尾将日期和时间戳的两个不同输入设置为UTC格式的日期。我不确定使用
replaceAll
功能是否有效

投入:

  • 字符串日期=“06/04/2019”,格式为“MM/dd/yyyy”
  • 字符串timestamp=“15/03/2018 15:46:59.000386 PM-05:00”格式为 是“dd/MM/yyyy hh:MM:ss.ssss a XXX”
输出:
“06/04/2019 15:46:59.000386 PM-05:00”然后将其转换为UTC…

执行人员回答:
字符串。replaceAll
不适用于将日期时间或日期转换为UTC

Java(特别是Java8和更高版本)对解析、处理、转换和格式化日期和时间有很好的支持。例如:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
    DateTimeFormatter timestampFormatter = DateTimeFormatter
            .ofPattern("dd/MM/yyyy hh:mm:ss.SSSSSS a XXX", Locale.ENGLISH);

    String dateString = "06/04/2019";
    String timestampString = "15/03/2018 03:46:59.000386 PM -05:00";
    OffsetDateTime timestampOnDate = OffsetDateTime
            .parse(timestampString, timestampFormatter)
            .with(LocalDate.parse(dateString, dateFormatter));
    System.out.println("Output:        " + timestampOnDate.format(timestampFormatter));
    System.out.println("Output in UTC: "
            + timestampOnDate.withOffsetSameInstant(ZoneOffset.UTC)
                    .format(timestampFormatter));
这张照片是:

Output:        06/04/2019 03:46:59.000386 PM -05:00
Output in UTC: 06/04/2019 08:46:59.000386 PM Z
您的字符串和格式不太合理,因此我对它们进行了一些更改:
MM/dd
dd/MM
,下午15点到03点,因此也将
HH
(一天中的一小时)更改为
HH
(上午或下午的一小时)。如果这些更改不是正确的,只需进行您想要的更改即可

编辑:当然,如果您坚持,您可以这样做

    timestampString = timestampString.replaceFirst("^\\d{2}/\\d{2}/\\d{4}", dateString);

-获取
06/04/2019 03:46:59.000386 PM-05:00
,然后像以前一样解析。我认为此代码不可读,而且它也不会首先验证时间戳字符串中的日期。我建议使用日期时间类来处理日期和时间戳,就像我在代码示例中所做的那样。

为了补充上面的另一个答案,您还可以首先解析
LocalDate
,然后将其与
OffsetTime
合并以创建
OffsetDateTime

OffsetDateTime timestampOnDate = LocalDate
    // parse date (dd/MM/uuuu)
    .parse(dateString, dateFormatter)
    // join with time and offset (ignores 15/03/2018) 
    .atTime(OffsetTime.parse(timestampString, timestampFormatter));
OffsetTime.parse
将创建一个包含时间和偏移部分的对象(忽略您不想要的日期,在本例中为“15/03/2018”),并将其与
LocalDate
连接,生成所需的
OffsetDateTime

但不确定哪种代码更好。我想两者都是等价的


replaceAll
可能有效,但只有当
dateString
是一个有效的日期时才有效-解析时会选中该日期。如果日期字符串包含无效的日期,例如35/99/0000,或其他格式的有效日期,甚至是一些无意义的文本,
replaceAll
不会抱怨,结果将是不正确的字符串


但是将这些无效值解析为日期会引发异常,因此最好按照它们真正表示的类型处理数据。

你说得对,
replaceAll
不起作用。相反,将字符串解析为日期,并对date对象执行任何需要的操作?!?搜索,和。有很多例子可以找到。时间戳中的时间是下午15点?!?另外,将日期转换为UTC的预期结果是什么?可能的重复。这个问题已经被问和回答了很多次,请搜索。完全同意你的答案,也同意亨利。你是个职业选手!!!非常感谢您如此透彻地解释,我将从这里开始。是的,我在那里为dd输入了一个错误,很抱歉!时间充满了可能性。我想我还是希望将时间戳解析为
OffsetDateTime
以避免从一开始就丢弃信息。但是,您可以使用它的
toOffsetTime
方法,并按照代码中的方法进行操作。这样可能会感觉更自然?是的,我和你的反馈都玩过了,效果非常好!在我从第三方获得的时间戳输入结束时,他们对其进行了修改,以便我可以收到一个正常的时间戳MM/dd/yyyy。。。。。谢谢大家!!