gpt4 book ai didi

android - 从字符串创建Joda日期时间UTC

转载 作者:行者123 更新时间:2023-11-29 19:09:34 25 4
gpt4 key购买 nike

我要更改为UTC的以下String


  2017年8月24日星期四07:38:32 GMT + 01:00


我正在使用Joda-Time库。

我知道如何创建新的Datetime例如new dateTime(DateTimeZone.UTC),但是如何从上述DateTime创建String对象?

我尝试了以下方法,但出现了异常。当然,必须有另一种方法来创建DT对象,而不将原始String切碎吗?如果外部API改变了它向我的应用发送原始String的方式,我的String操作代码将失败。

DateTimeFormatter df = DateTimeFormat.forPattern("dd-MMM-YYYY HH:mm");
String strOrigTime = "Thu Aug 24 07:38:32 GMT+01:00 2017";
DateTime dt = DateTime.parse(strOrigTime, df);

Log.e(TAG, "dt after parse = " + dt.toString());


错误:

Caused by: java.lang.IllegalArgumentException: Invalid format: "Thu Aug 24 07:38:32 GMT+01:00 2017"
at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:866)
at org.joda.time.DateTime.parse(DateTime.java:144)

最佳答案

使用的格式(dd-MMM-YYYY HH:mm)表示:日(dd),后跟-,后跟月(MMM),后跟-,然后是年(YYYY),依此类推(< aa>了解更多信息)。

此格式与输入字符串不匹配(输入的是星期几,然后是月份,然后是天,然后是小时/分钟/秒,等等)。因此,第一件事就是使用与输入匹配的格式,否则您将始终收到“无效格式”错误。

另一个细节是星期几和月几日的名称为英文,因此您还必须使用java.util.Locale指定用于解析输入的语言。如果您不使用语言环境,则将使用系统默认值,并且不能保证始终使用英语(而且即使在运行时也可以更改,因此最好指定一个)。

我还必须添加“ GMT”作为文字,并调用withOffsetParsed()使其包含解析对象中的偏移量(+01:00):

DateTimeFormatter df = DateTimeFormat
// use a pattern that matches input
.forPattern("EEE MMM dd HH:mm:ss 'GMT'Z yyyy")
// use English locale for day of week and month
.withLocale(Locale.ENGLISH)
// include the offset (+01:00) in the parsed object
.withOffsetParsed();
String strOrigTime = "Thu Aug 24 07:38:32 GMT+01:00 2017";
DateTime dt = DateTime.parse(strOrigTime, df);
System.out.println(dt.toString());


输出为:


  2017-08-24T07:38:32.000 + 01:00


然后,您可以将UTC时区设置为此对象:

dt = dt.withZone(DateTimeZone.UTC);
System.out.println(dt.toString());


输出将是:


  2017-08-24T06:38:32.000Z


请注意, withZone方法保留相同的时刻(两个日期都表示相同的时间点),只是输出中使用的时区已更改。但是两个日期都是相等的(它们表示相同的时刻,因为偏移量+01:00的07:38与UTC的06:38相同)。

如果要将所有日期都转换为UTC,也可以在格式化程序中进行设置:

// set UTC to the formatter
df = df.withZone(DateTimeZone.UTC);


然后,您无需在 withZone对象中调用 DateTime:所有解析的日期都将转换为UTC。



您还告诉我们“如果外部API更改了它向我的应用发送原始 String的方式,我的 String操作代码将失败”。

好吧,如果输入 String发生更改,那么您还必须更改格式-别无选择,Joda-Time不能只猜测格式是什么,就必须告诉它。

如果要解析一种以上的格式,则有一种方法可以创建使用许多不同模式的格式化程序,并尝试解析每种格式,直到其中一种有效(或者如果没有一种有效则抛出异常)。您可以这样做:

// format 1
DateTimeFormatter f1 = DateTimeFormat
// use a pattern that matches input
.forPattern("EEE MMM dd HH:mm:ss 'GMT'Z yyyy")
// use English locale for day of week and month
.withLocale(Locale.ENGLISH)
// include the offset (+01:00) in the parsed object
.withOffsetParsed();

// format 2
DateTimeFormatter f2 = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss Z");
// array of all possible formats
DateTimeParser[] parsers = { f1.getParser(), f2.getParser() };
// formatter that uses all the possible formats
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
// append array of possible formats
.append(null, parsers)
// create formatter
.toFormatter().withLocale(Locale.ENGLISH).withOffsetParsed()
// set all parsed objects to UTC
.withZone(DateTimeZone.UTC);

// parse first format
System.out.println(DateTime.parse("Thu Aug 24 07:38:32 GMT+01:00 2017", formatter));
// parse second format
System.out.println(DateTime.parse("24/08/2017 07:38:32 +01:00", formatter));


这两个日期都将解析为:


  2017-08-24T06:38:32.000Z


然后,您可以根据需要向阵列添加新格式。



Java新的日期/时间API

Joda-Time处于维护模式,并且已被新的API取代,因此,我不建议使用它来启动新项目。即使在 check the javadoc中,它也表示:“请注意,Joda-Time被认为是一个很大程度上“完成”的项目。没有计划进行重大增强。如果使用Java SE 8,请迁移到java.time(JSR-310)。” 。

如果您不能(或不想)从Joda-Time迁移到新的API,则可以忽略此部分。

如果您使用的是Java 8,请考虑使用 joda's websitenew java.time API更容易。

如果您使用的是Java <= 7,则可以使用 less bugged and less error-prone than the old APIs,这是Java 8的新日期/时间类的绝佳反向端口。对于Android,还有 ThreeTen Backport(有关如何使用它的更多信息 ThreeTenABP)。

下面的代码对两者都适用。
唯一的区别是包名称(在Java 8中为 java.time,在ThreeTen Backport(或Android的ThreeTenABP)中为 org.threeten.bp),但是类和方法的名称相同。

解析输入的代码非常相似,但格式略有变化。
我正在使用 Instant类,因为您希望使用UTC输出,而 Instant表示UTC瞬间:

// format 1
DateTimeFormatter f1 = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss O yyyy", Locale.ENGLISH);
// format 2
DateTimeFormatter f2 = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss XXX");
// formatter with both formats
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
// add format 1
.appendOptional(f1)
// add format 2
.appendOptional(f2)
// create formatter
.toFormatter(Locale.ENGLISH);
// parse first format
System.out.println(Instant.from(formatter.parse("Thu Aug 24 07:38:32 GMT+01:00 2017")));
// parse second format
System.out.println(Instant.from(formatter.parse("24/08/2017 07:38:32 +01:00")));


这将输出:


  2017-08-24T06:38:32Z
  2017-08-24T06:38:32Z

关于android - 从字符串创建Joda日期时间UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45854793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com