Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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-SimpleDataFormatter不可解析日期_Java_Json_Date - Fatal编程技术网

Java-SimpleDataFormatter不可解析日期

Java-SimpleDataFormatter不可解析日期,java,json,date,Java,Json,Date,使用Java的SimpleDataFormat和Google的Gson库,我试图解析从Minecraft库目录下载的Json文件中的日期。使用以下SimpleDataFormat解析日期时出现问题:yyyy-MM-dd'T'HH:MM:ssZ 我还尝试了以下方法: yyyy-MM-dd'T'HH:mm:ssX yyyy-MM-dd'T'HH:mm:ssz yyyy-MM-dd'T'HH:mm:ssx 因为这个文件实际上是从网上下载的,所以我没有办法更改它。因此,解决方案必须在于修改代码,使其不

使用Java的SimpleDataFormat和Google的Gson库,我试图解析从Minecraft库目录下载的Json文件中的日期。使用以下SimpleDataFormat解析日期时出现问题:
yyyy-MM-dd'T'HH:MM:ssZ

我还尝试了以下方法:

yyyy-MM-dd'T'HH:mm:ssX
yyyy-MM-dd'T'HH:mm:ssz
yyyy-MM-dd'T'HH:mm:ssx
因为这个文件实际上是从网上下载的,所以我没有办法更改它。因此,解决方案必须在于修改代码,使其不包含日期,或者从源代码中删除有问题的代码。这恰好是一个相当大的问题,因为我的应用程序在解析日期时死亡,这似乎是一个解析问题,而不是文件问题

日期格式如下:

2013-12-18T00:41:38-0500
2013-10-25T15:00:00+02:00
以上两个日期都使它崩溃。它们都来自不同的文件。我在网上浏览了多种解决方案,但似乎没有一种能解决这个问题


我甚至在
#technic
频道上询问过,并浏览了
TechnicLauncher
源代码,但几乎找不到任何帮助。由于我使用的类实际上与Technic Launcher完全相同,这让我很困惑。如果您想仔细阅读源代码,可以在这里查看:

Java7-使用格式代码X

import java.text.SimpleDateFormat;

public class Test {
  public static void main(String[] args) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
    String date1 = "2013-12-18T00:41:38-0500";
    String date2 = "2013-10-25T15:00:00+08:00";

    try {
      System.out.println(dateFormat.parse(date1));      
      System.out.println(dateFormat.parse(date2));
    } catch (Exception e ) {
      System.out.println(e);
    }     
  }
}
产生输出

Wed Dec 18 05:41:38 GMT 2013
Fri Oct 25 08:00:00 BST 2013

当冬天在爱尔兰跑步时。

Java日期/时间是最令人头疼的问题。不管怎样,诀窍在于我使用了xml日历解析器和SimpleDataFormat相结合,而且似乎很有效。不久前我还在我的网站上发布了这篇文章,可能你也可以在那里使用。但无论如何,答案是这样的。只需使用此方法并发出一些小tweet,然后在DateTypeAdapter类上插入(替换)反序列化ToDate()方法:

   private Date deserializeToDate(/*JsonElement*/String json) /*Json*/ParseException {
      Date d = null;
      String date = json; // json.getAsString();
      try {
         d = javax.xml.bind.DatatypeConverter.parseDateTime(date).getTime();
      } catch (Exception e) {} // ignore
      if (d == null) {
         SimpleDateFormat dateFormat = 
                  new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
         d = dateFormat.parse(date);      
      }
      return d;
   }

   @Test
   public void shouldParseXmlDateTime() {
      String date1 = "2013-12-18T00:41:38-0500";
      String date2 = "2013-10-25T15:00:00+08:00";

      try {
        System.out.println(deserializeToDate(date1));      
      } catch (Exception e ) {
        System.out.println(e);
      }     
      try {
         System.out.println(parse(date2));      
       } catch (Exception e ) {
         System.out.println(e);
       }     
   }
这将产生:

Wed Dec 18 00:41:38 EST 2013
Fri Oct 25 03:00:00 EDT 2013
tl;博士 在修复错误之前:

OffsetDateTime.parse( 
    "2013-12-18T00:41:38-0500" , 
    DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssX" )
)
OffsetDateTime.parse( "2013-12-18T00:41:38-0500" )
修复错误时:

OffsetDateTime.parse( 
    "2013-12-18T00:41:38-0500" , 
    DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssX" )
)
OffsetDateTime.parse( "2013-12-18T00:41:38-0500" )
java.time 现代方法使用java.time类


这也适用于
2013-12-18T00:41:38-0500
。不幸的是,事实并非如此。
OffsetDateTime
类有一个错误,当来自UTC的偏移部分在小时和分钟之间缺少可选的冒号时,该错误就会出现。因此,
2013-12-18T00:41:38-05:00
会起作用,但不会
2013-12-18T00:41:38-0500

作为解决方法,请定义格式模式

String input = "2013-12-18T00:41:38-0500" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssX" ) ;
OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;
odt.toString():2013-12-18T00:41:38-05:00

有关更多讨论,请参见类似问题:


乔达时间 更新:项目现在开始,团队建议迁移到类。这一部分作为历史保留下来

仅供参考,如果您使用java.util.Date/Calendar类来代替众所周知的麻烦的java.util.Date/Calendar类,那么您可以直接将该字符串传递到构造函数中,而无需格式化程序。Joda Time使用ISO 8601作为其默认值

DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTime = new DateTime( "2007-03-01T13:00:00Z", timeZone );
如果您想在UTC中工作而不调整时区,只需从上面的代码中省略时区内容

如果出于其他目的需要java.util.Date对象,请从Joda Time转换

java.util.Date date = dateTime.toDate();

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。你可以在这里找到一些有用的课程,如、、和。

你的第一个格式和日期对我很有用。
2013-12-18T00:41:38-0500
2013年12月18日星期三00:41:38 GMT
不一样,因为时区是GMT。不是
2013年12月18日星期三05:41:38 GMT
。删除“Z”只会忽略时区,并假设JVM的默认时区这只帮助我找到格式是否正确运行,实际上并没有帮助解决我的问题。您说您的问题是,当您使用“Z”后缀时,它崩溃了。我提出的解决方案是使用“X”后缀,a)不会崩溃,b)给出正确的结果。阿司匹林治疗头痛:或者。尽管这对其他人很有用,但这并不能解决我的问题。我遇到的问题是,我从我的文件中检索的日期在运行时会导致JsonParseException。我知道你要做什么,你想让我修复LauncherCore。。。不管怎样,你也能做到。。。您所要做的就是:下载LauncherCore,进行一些更改并重新打包。需要进行的更改位于DateTypeAdapter.deserializeToDate()中?简单地用我上面更改的方法替换。恐怕我不太明白我应该修复什么。是的,我恐怕这实际上不会改变任何东西。我得到了完全相同的结果:
Exception:JsonSyntaxException,消息:2013-10-25T15:00:00+02:00