首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字符串中解析带有时区的日期

从字符串中解析带有时区的日期
EN

Stack Overflow用户
提问于 2018-07-15 16:41:32
回答 2查看 185关注 0票数 1

快(我想)提问吧。如何将像"2018-07-22 +3:00"这样的字符串解析为OffsetDateTime (将时间设置为0:0:0.0)?

代码语言:javascript
复制
DateTimeFormatter formatter =cDateTimeFormatter.ofPattern("yyyy-MM-dd xxx");
OffsetDateTime dt = OffsetDateTime.parse("2007-07-21 +00:00", formatter);

java.time.format.DateTimeParseException:文本'2007-07-21 +00:00‘无法解析:无法从TemporalAccessor获得OffsetDateTime:{OffsetSeconds=0},OffsetDateTime解析为java.time.format.Parsed类型的2007-07-21

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-15 16:59:56

OffsetDateTime需要一天的时间,但是您的格式字符串不提供这个时间,所以您需要告诉DateTimeFormatter默认的一天时间到午夜。

另外,偏移量+3:00是无效的,因为小时必须是2位数,这意味着您需要首先修复这个问题。

这两者都能做到:

代码语言:javascript
复制
public static OffsetDateTime parse(String text) {
    // Fix 1-digit offset hour
    String s = text.replaceFirst("( [+-])(\\d:\\d\\d)$", "$10$2");

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendPattern("uuuu-MM-dd xxx")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .toFormatter();
    return OffsetDateTime.parse(s, formatter);
}

测试

代码语言:javascript
复制
System.out.println(parse("2018-07-22 +3:00"));
System.out.println(parse("2018-07-22 +03:00"));
System.out.println(parse("2007-07-21 +00:00"));

输出

代码语言:javascript
复制
2018-07-22T00:00+03:00
2018-07-22T00:00+03:00
2007-07-21T00:00Z
票数 3
EN

Stack Overflow用户

发布于 2018-07-15 16:53:19

这里的诀窍是从获取TemporalAccessor开始

代码语言:javascript
复制
TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyy-MM-dd XXX").parse("2018-07-22 +03:00");

在那里,您可以提取LocalDateZoneOffset

代码语言:javascript
复制
LocalDate date = LocalDate.from(ta);
ZoneOffset tz = ZoneOffset.from(ta);

然后像这样把它们结合起来:

代码语言:javascript
复制
ZonedDateTime zdt = date.atStartOfDay(tz);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51350231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档