Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Joda Time解析带有时区的日期并保留该时区_Java_Date_Jodatime - Fatal编程技术网

Java Joda Time解析带有时区的日期并保留该时区

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

我想解析一个日期,它是用一个特定的时区创建的,将它转换成一种格式并返回它。转换有效,但时区偏移始终设置为+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 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(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。

使用该格式
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 );