Java Joda Time解析带有时区的日期并保留该时区
我想解析一个日期,它是用一个特定的时区创建的,将它转换成一种格式并返回它。转换有效,但时区偏移始终设置为+0000,并根据需要添加/减去时差。如何使其格式化并保持偏移量正确 我期待这个:2012-11-30T12:08:56.23+07:00 但是请记住:2012-11-30T05:08:56.23+00:00 实施:Java Joda Time解析带有时区的日期并保留该时区,java,date,jodatime,Java,Date,Jodatime,我想解析一个日期,它是用一个特定的时区创建的,将它转换成一种格式并返回它。转换有效,但时区偏移始终设置为+0000,并根据需要添加/减去时差。如何使其格式化并保持偏移量正确 我期待这个:2012-11-30T12:08:56.23+07:00 但是请记住:2012-11-30T05:08:56.23+00:00 实施: public static final String ISO_8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSZZ"; public s
public static final String ISO_8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSZZ";
public static String formatDateToISO8601Standard(Date date) {
DateTime dateTime = new DateTime(date);
DateTimeFormatter df = DateTimeFormat.forPattern(ISO_8601_DATE_FORMAT);
return dateTime.toString(df);
}
测试等级:
private static final String DATE_WITH_TIMEZONE = "30 11 2012 12:08:56.235 +0700";
private static final String EXPECTED_DATE_WITH_TIMEZONE = "2012-11-30T12:08:56.23+07:00";
@Test public void testFormattingDateWithSpecificTimezone() throws Exception {
String result = JodaDateUtil.formatDateToISO8601Standard(createDate(DATE_WITH_TIMEZONE));
assertEquals("The date was not converted correctly", EXPECTED_DATE_WITH_TIMEZONE, result); }
private Date createDate(String dateToParse) throws ParseException {
DateTimeFormatter df = DateTimeFormat.forPattern("dd MM yyyy HH:mm:ss.SSS Z");
DateTime temp = df.parseDateTime(dateToParse);
Date date = temp.toDate();
return date; }
基本上,一旦解析日期字符串[在createDate()方法中],就失去了原始区域。将允许您使用任何区域设置日期格式,但您需要保留原始区域 在createDate()方法中,“df”可以返回字符串上的区域。你需要使用这个方法。然后,当你有时间的时候,打电话。如果将此区域保存在某个位置或以某种方式将其传递给格式化例程,则可以通过创建DateTimeFormatter“withZone”并将该区域指定为格式中所需的区域来使用它 作为演示,这里有一个方法中的一些示例代码。希望它能帮助您改变代码的运行方式
public static void testDate()
{
DateTimeFormatter df = DateTimeFormat.forPattern("dd MM yyyy HH:mm:ss.SSS Z");
DateTime temp = df.withOffsetParsed().parseDateTime("30 11 2012 12:08:56.235 +0700");
DateTimeZone theZone = temp.getZone();
Date date = temp.toDate();
DateTime dateTime = new DateTime(date);
DateTimeFormatter df2 = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSZZ");
DateTimeFormatter df3 = df2.withZone(theZone);
System.out.println(dateTime.toString(df2));
System.out.println(dateTime.toString(df3));
}
试试这个
ISODateTimeFormat.dateTimeParser().parseDateTime(dateString),
然后将其转换为您想要的格式。tl;博士
2012-11-30T12:08:56.235+07:00
细节
公认的答案是正确的。一旦转换为java.util.Date
对象,就会丢失时区信息。这是复杂的,因为java.util.Date::toString
在生成字符串时会混淆地应用当前默认时区
避免使用这些旧的日期时间类,如java.util.date
。它们设计拙劣、混乱且麻烦。现在是遗留的,被java.time项目取代。Joda时间项目现在也被java.Time类所取代
java.time
将该输入字符串解析为OffsetDateTime
对象,因为它包含与UTC的偏移量,但缺少时区。调用以指定与输入字符串匹配的自定义格式。将格式化程序对象传递给
odt:toString():2012-11-30T12:08:56.235+07:00
要查看UTC中的同一时刻,请提取一个瞬间
。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)
instant.toString():2012-11-30T05:08:56.235Z
您可以应用任何时区,通过该时区可以查看时间线上的同一时刻、同一点
ZonedDateTime zdtKolkata = odt.toInstant ().atZone ( ZoneId.of ( "Asia/Kolkata" ) );
zdtKolkata.toString():2012-11-30T10:38:56.235+05:30[亚洲/加尔各答]
根本不需要加入旧的日期时间类。坚持使用java.time。如果必须使用一些尚未更新为java.time类型的旧代码,请查看添加到旧类中的新方法,以便与java.time进行转换
java.util.Date
的等价物是Instant
,两者都是自UTC的1970-01-01T00:00:00Z
时代以来的计数。但是要小心数据丢失,因为java.time类支持纳秒分辨率,但旧类仅限于毫秒
java.util.Date utilDate = java.util.Date.from( instant );
实时代码
看
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到java.time 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 从哪里获得java.time类
- 后来
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 该项目专门针对Android采用了Three Ten Backport(如上所述)
- 看
val formatter=DateTimeFormat.forPattern(“yyyy-MM-dd-HH:MM:ss.SSSZZ”)这些方法在哪里?我没有看到他们:1。DateTimeFormatter.of模式(“dd MM uuu HH:MM:ss.SSS X”);你是说forPattern()?2.OffsetDateTime odt=OffsetDateTime.parse我只看到OffsetDateTime字段,它没有静态解析method@CACuzcatlan我添加了指向类文档的链接。并在IdeOne.com中添加了实时工作代码的链接。谢谢。我刚刚意识到我很困惑,因为我在寻找JodaTime中的那些,但它们是java中的。time@CACuzcatlan仅供参考,Joda Time项目建议迁移到java.Time类。实际上,您可以在项目中使用这两种方法,但要小心使用
import
语句,以避免类名称和方法名称的冲突(如您所见)。请改用ISODateTimeFormat.dateTimeParser().withOffsetParsed().parseDateTime(dateString)代码>
Instant instant = odt.toInstant();
ZonedDateTime zdtKolkata = odt.toInstant ().atZone ( ZoneId.of ( "Asia/Kolkata" ) );
java.util.Date utilDate = java.util.Date.from( instant );