首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解析带有时区但没有T或纳秒的日期时间

如何解析带有时区但没有T或纳秒的日期时间
EN

Stack Overflow用户
提问于 2019-02-22 22:25:42
回答 3查看 2.6K关注 0票数 4

我试图以以下格式解析日期时间字符串:

代码语言:javascript
运行
复制
2019-02-22 19:29:43+00:00

我正在遵循这个指南:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

这个特定的行似乎是我要分析的时间戳字符串:

代码语言:javascript
运行
复制
Z       zone-offset                 offset-Z          +0000; -0800; -08:00;

这是我创建的,给出了指南:

代码语言:javascript
运行
复制
String input = "2019-02-22 19:29:43+00:00";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssX");
LocalDateTime parsed = LocalDateTime.parse(input, formatter);

但我知道这个错误:

代码语言:javascript
运行
复制
 java.time.format.DateTimeParseException: Text '2019-02-22 19:29:43+00:00' could not be parsed, unparsed text found at index 22
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-22 22:41:39

试试yyyy-MM-dd HH:mm:ssXXX。这应该能解决你的问题。

偏移量X和x: 一个字母只输出小时,如'+01',除非分钟为非零,在这种情况下,分钟也输出,如'+0130‘。 两个字母输出小时和分钟,没有冒号,例如'+0130‘。 三个字母输出小时和分钟,带有冒号,如'+01:30‘。 四个字母输出小时、分钟和可选秒,没有冒号,如'+013015‘。 五个字母输出小时、分钟和可选秒,带有冒号,如'+01:30:15‘。 六个或六个以上的字母会抛出IllegalArgumentException。

来自下面表中的描述:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

编辑:

如果您想用该模式格式化日期,并且希望使用相同的输出字符串,则应该使用yyyy-MM-dd HH:mm:ssxxx (请参见下面Andreas的注释)。

票数 3
EN

Stack Overflow用户

发布于 2019-02-23 00:08:25

tl;dr

·错误类OffsetDateTime,而不是LocalDateTime

·默认情况下,将空间替换为T,用于标准格式。

代码语言:javascript
运行
复制
OffsetDateTime.parse(               // Do NOT use `LocalDateTime` class, use `OffsetDateTime` because your input has an offset-from-UTC. 
    "2019-02-22 19:29:43+00:00"
    .replace( " " , "T" )           // Replace SPACE in middle with a `T` to comply with ISO 8601 standard format.
)                                   // Returns a `OffsetDateTime`.

参见此代码在IdeOne.com现场运行。

错误类型

您的输入字符串包括一个与世界协调时相抵

但是,您正试图将其解析为,因为LocalDateTime没有时区与世界协调时相抵的概念,因为它并不代表瞬间。那么,方钉,圆孔.你在丢弃有价值的信息。

相反,您应该作为一个OffsetDateTime进行解析。

ISO 8601

您的输入字符串几乎是标准的ISO 8601格式。要完全遵守,只需将中间的空间替换为T

代码语言:javascript
运行
复制
String input = "2019-02-22 19:29:43+00:00".replace( " " , "T" ) ;

java.time类在解析/生成字符串时默认使用ISO8601格式。因此,不需要指定格式模式。

代码语言:javascript
运行
复制
OffsetDateTime odt = OffsetDateTime.parse( input ) ;

关于java.time

http://docs.oracle.com/javase/10/docs/api/java/time/package-summary.html框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见http://docs.oracle.com/javase/tutorial/datetime/TOC.html。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310

http://www.joda.org/joda-time/项目现在在维护模式中,建议迁移到java.time类。

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 4.2。不需要字符串,也不需要java.sql.*类。

在哪里获得java.time类?

  • Java 8Java 9Java 10Java 11和更高版本--捆绑实现的标准Java的一部分。
    • Java 9添加了一些次要的特性和修复。

  • Java 6Java 7
    • 大多数java.time功能都是在http://www.threeten.org/threetenbp/中移植到Java6&7中的。

  • 安卓
    • 较晚版本的Android实现的java.time类。
    • 对于早期的Android (<26),https://github.com/JakeWharton/ThreeTenABP项目采用了http://www.threeten.org/threetenbp/ (上面提到的)。见http://stackoverflow.com/q/38922754/642706

三次-额外项目使用其他类扩展java.time。这个项目是将来可能加入java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter更多

票数 4
EN

Stack Overflow用户

发布于 2021-12-18 05:44:58

解决此问题的工作代码如下

代码语言:javascript
运行
复制
public class Demo {
public static void jodaTimeStuff(String dateString, DateTimeZone dtz) {
    System.out.println(StringUtils.leftPad(dateString, 29, " ") + "\t------->\t" + DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ssZ").parseDateTime(dateString).toDateTime(dtz));
}
public static void main(String[] args) throws Exception {
    jodaTimeStuff("2019-02-22 19:29:43+00:00", DateTimeZone.UTC);
    jodaTimeStuff("2019-02-22 19:29:43+00:00", DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Kolkata")));
}

}

示例代码中使用的一些依赖项(一个用于格式化,另一个用于joda:

代码语言:javascript
运行
复制
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10.13</version>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.8</version>
    </dependency>

(请在祈祷中记住我)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54836037

复制
相关文章

相似问题

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