Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

反序列化带时区的时间字符串失败 #2754

Closed
cqdavidwei opened this issue Sep 18, 2019 · 12 comments · Fixed by #2778
Closed

反序列化带时区的时间字符串失败 #2754

cqdavidwei opened this issue Sep 18, 2019 · 12 comments · Fixed by #2778
Milestone

Comments

@cqdavidwei
Copy link

你好,我在Java中使用1.2.60的fastjson反序列化如下json时会出现反序列化失败:
待反序列化的Json内容:
"{"p1":"2019-09-18T20:35:00+12:45"}"

用于反序列化的类:
public class C{
public Calendar p1;
}

我看了下fastjson的底层源码,发现是JSONScanner类的第479行代码(scanISO8601DateIfMatch方法中)有个判断if (t3 != '0' && t3 != '3'){return false;}导致的,当时间带时区且时区不是0分或者30分时,就认为不是ISO8601的格式,但实际上的确有些地方的时区是45分,比如新西兰的时区是+12:45,具体可以见下面的wiki:
https://en.wikipedia.org/wiki/List_of_UTC_time_offsets
同时,我看了下ISO8601的wiki,规范中并未限制时区的分钟部分只能是0或者30分,见下wiki:
https://en.wikipedia.org/wiki/ISO_8601#Time_offsets_from_UTC

所以麻烦看一看这个问题是否是bug或者是有什么其他方法可以绕过这个问题吧?

@cqdavidwei
Copy link
Author

hi 有人能帮忙看下这个问题吗?

@XYNIK
Copy link

XYNIK commented Sep 24, 2019 via email

@XYNIK
Copy link

XYNIK commented Sep 24, 2019 via email

@XYNIK
Copy link

XYNIK commented Sep 24, 2019 via email

@cqdavidwei
Copy link
Author

@Omega-Ariston 你好,我看了下你修复后的代码,限制得比较死,只是单独支持了+12:45时区的反序列化(if(t0 == '1' && t1 == '2' && t3 == '4' && t4 == '5') {}),但实际上,特殊的时区还有+05:45, +08:45,所以避免后面再出现类似问题,麻烦也一并解决下吧?谢谢。

wenshao added a commit that referenced this issue Sep 26, 2019
fix issue #2754(反序列化带时区的时间字符串失败)
@Omega-Ariston
Copy link
Collaborator

@Omega-Ariston 你好,我看了下你修复后的代码,限制得比较死,只是单独支持了+12:45时区的反序列化(if(t0 == '1' && t1 == '2' && t3 == '4' && t4 == '5') {}),但实际上,特殊的时区还有+05:45, +08:45,所以避免后面再出现类似问题,麻烦也一并解决下吧?谢谢。

嗯嗯,之前看wiki以为只有新西兰时区情况特殊,后来仔细查了下发现还有以下几个:

  • Asia/Kathmandu +05:45
  • Asia/Katmandu +08:45
  • Australia/Eucla +08:45
  • NZ-CHAT +12:45
  • Pacific/Chatham +12:45

多谢提醒,一会完善一下 :)

@cqdavidwei
Copy link
Author

@Omega-Ariston 你好,我看了下你修复后的代码,限制得比较死,只是单独支持了+12:45时区的反序列化(if(t0 == '1' && t1 == '2' && t3 == '4' && t4 == '5') {}),但实际上,特殊的时区还有+05:45, +08:45,所以避免后面再出现类似问题,麻烦也一并解决下吧?谢谢。

嗯嗯,之前看wiki以为只有新西兰时区情况特殊,后来仔细查了下发现还有以下几个:

  • Asia/Kathmandu +05:45
  • Asia/Katmandu +08:45
  • Australia/Eucla +08:45
  • NZ-CHAT +12:45
  • Pacific/Chatham +12:45

多谢提醒,一会完善一下 :)

客气了,另外,我想问下,这个大概会在哪个版本解决呢?

Omega-Ariston added a commit to Omega-Ariston/fastjson that referenced this issue Sep 26, 2019
@Omega-Ariston
Copy link
Collaborator

@Omega-Ariston 你好,我看了下你修复后的代码,限制得比较死,只是单独支持了+12:45时区的反序列化(if(t0 == '1' && t1 == '2' && t3 == '4' && t4 == '5') {}),但实际上,特殊的时区还有+05:45, +08:45,所以避免后面再出现类似问题,麻烦也一并解决下吧?谢谢。

嗯嗯,之前看wiki以为只有新西兰时区情况特殊,后来仔细查了下发现还有以下几个:

  • Asia/Kathmandu +05:45
  • Asia/Katmandu +08:45
  • Australia/Eucla +08:45
  • NZ-CHAT +12:45
  • Pacific/Chatham +12:45

多谢提醒,一会完善一下 :)

客气了,另外,我想问下,这个大概会在哪个版本解决呢?

据我所知,正常情况下master分支里的代码是会和下一个版本一起打包发布

@cqdavidwei
Copy link
Author

@Omega-Ariston 你好,我看了下你修复后的代码,限制得比较死,只是单独支持了+12:45时区的反序列化(if(t0 == '1' && t1 == '2' && t3 == '4' && t4 == '5') {}),但实际上,特殊的时区还有+05:45, +08:45,所以避免后面再出现类似问题,麻烦也一并解决下吧?谢谢。

嗯嗯,之前看wiki以为只有新西兰时区情况特殊,后来仔细查了下发现还有以下几个:

  • Asia/Kathmandu +05:45
  • Asia/Katmandu +08:45
  • Australia/Eucla +08:45
  • NZ-CHAT +12:45
  • Pacific/Chatham +12:45

多谢提醒,一会完善一下 :)

客气了,另外,我想问下,这个大概会在哪个版本解决呢?

据我所知,正常情况下master分支里的代码是会和下一个版本一起打包发布

好的,感谢支持。:)

wenshao added a commit that referenced this issue Sep 26, 2019
@wenshao wenshao added this to the 1.2.62 milestone Oct 3, 2019
@cqdavidwei
Copy link
Author

cqdavidwei commented Oct 22, 2019

@Omega-Ariston hi, 我又发现两个时区为45分的特殊情况,分别如下,可能需要麻烦你处理下了。
+09:45
+13:45

除了上面的+09:45和+13:45,还发现一些特殊的时区,如:-00:44,-00:25:21,+00:20,+01:24,+04:51,+05:40,+07:20等等。
完整的时区可以见下面这个wiki页面中最下方的表格:
https://en.wikipedia.org/wiki/List_of_UTC_time_offsets

@Omega-Ariston
Copy link
Collaborator

@Omega-Ariston hi, 我又发现两个时区为45分的特殊情况,分别如下,可能需要麻烦你处理下了。
+09:45
+13:45

除了上面的+09:45和+13:45,还发现一些特殊的时区,如:-00:44,-00:25:21,+00:20,+01:24,+04:51,+05:40,+07:20等等。
完整的时区可以见下面这个wiki页面中最下方的表格:
https://en.wikipedia.org/wiki/List_of_UTC_time_offsets

我核实下

@cqdavidwei
Copy link
Author

@Omega-Ariston hi 麻烦问下,这个核实有结果了吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants