Java日期时间格式模式:ISO_OFFSET_DATE_TIME

huangapple go评论72阅读模式
英文:

Java date time format pattern for ISO_OFFSET_DATE_TIME

问题

我需要 ISO_OFFSET_DATE_TIME 的日期时间格式模式:

2019-09-30T10:05:16+10:00

yyyy-MM-dd'T'HH:mm:ssZ 对于 2019-09-30T10:05:16+1000 是有效的,但我需要区域偏移中的冒号。

如果这不可行,我将需要一个正则表达式。

英文:

I'm after the date time format pattern for ISO_OFFSET_DATE_TIME

2019-09-30T10:05:16+10:00

yyyy-MM-dd'T'HH:mm:ssZ is valid for 2019-09-30T10:05:16+1000 but I need the colon in the zone offset

If this is not possible, I'll need a regular expression.

答案1

得分: 3

你需要在这里使用 uuuu-MM-dd'T'HH:mm:ssXXX

String str = "2019-09-30T10:05:16+10:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX");
OffsetDateTime datetime = OffsetDateTime.parse(str, formatter);
System.out.println(datetime);
英文:

You need uuuu-MM-dd'T'HH:mm:ssXXX here.

String str = "2019-09-30T10:05:16+10:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX");
OffsetDateTime datetime = OffsetDateTime.parse(str, formatter);
System.out.println(datetime);

答案2

得分: 0

这要视情况而定。DateTimeFormatter.ISO_OFFSET_DATE_TIME 可以打印和解析带有秒数和不带秒数的字符串,以及带有小数秒和不带小数秒的字符串,后者最多可以有 9 位小数。

如果你只需要问题中所示格式变体的模式,即带秒数但不带小数秒,那么 MC Emperor 给出的答案正好适合你。

如果你需要完全灵活的 ISO_OFFSET_DATE_TIME,那么就没有一个模式可以满足你的需求。那时你需要使用正则表达式的方式。但正则表达式很难像格式化器一样提供严格的验证。而且正则表达式可能会变得复杂,难以理解。

链接:我在类似问题中的回答,其中提供了更多细节。

英文:

It depends. DateTimeFormatter.ISO_OFFSET_DATE_TIME prints and parses strings with and without seconds and with and without fraction of second, the latter up to 9 decimals.

If you only need the pattern for the variant of the format given in your question, with seconds and without fraction of second, the answer by MC Emperor is exactly what you need.

If you need the full flexibility of ISO_OFFSET_DATE_TIME, then there is no pattern that can give you that. Then you will need to go the regular expression way. Which in turn can hardly give you as strict a validation as the formatter. And the regular expression may still grow complicated and very hard to read.

Link: My answer to a similar question with a few more details.

答案3

得分: 0

你可以使用 `yyyy-MM-dd'T'HH:mm:ssZZZZZ` 或者 `uuuu-MM-dd'T'HH:mm:ssXXX`
**演示:**

```java
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "2019-09-30T10:05:16+10:00";
        OffsetDateTime odt = OffsetDateTime.parse(strDateTime);
        // 默认格式,即 OffsetDateTime#toString
        System.out.println(odt);

        // 自定义格式
        System.out.println(odt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZZZZZ")));
        System.out.println(odt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX")));
    }
}

输出:

2019-09-30T10:05:16+10:00
2019-09-30T10:05:16+10:00
2019-09-30T10:05:16+10:00

<details>
<summary>英文:</summary>

You can use `yyyy-MM-dd&#39;T&#39;HH:mm:ssZZZZZ` or `uuuu-MM-dd&#39;T&#39;HH:mm:ssXXX`.

**Demo:**

    import java.time.OffsetDateTime;
    import java.time.format.DateTimeFormatter;
    
    public class Main {
    	public static void main(String[] args) {
    		String strDateTime = &quot;2019-09-30T10:05:16+10:00&quot;;
    		OffsetDateTime odt = OffsetDateTime.parse(strDateTime);
    		// Default format i.e. OffsetDateTime#toString
    		System.out.println(odt);
    
    		// Custom format
    		System.out.println(odt.format(DateTimeFormatter.ofPattern(&quot;yyyy-MM-dd&#39;T&#39;HH:mm:ssZZZZZ&quot;)));
    		System.out.println(odt.format(DateTimeFormatter.ofPattern(&quot;yyyy-MM-dd&#39;T&#39;HH:mm:ssXXX&quot;)));
    	}
    }
**Output:**

    2019-09-30T10:05:16+10:00
    2019-09-30T10:05:16+10:00
    2019-09-30T10:05:16+10:00



</details>



huangapple
  • 本文由 发表于 2020年10月21日 15:12:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/64458388.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定