github 简介
Github是一个面向开源的私有软件托管平台,因为只支持Git作为唯一的版本库格式进行托管,所以叫Github。它于2008年4月10日正式上线,它的开发者也是linux之父:“林纳斯·本纳第克特·托瓦兹”,作为一个分布式的版本控制系统,Github的功能除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。目前,在 GitHub 上托管的版本数量非常之多,其中不乏知名开源项目 Ruby on Rails、jQuery、python 等。Github的仓库是他独有的特征,你大可以理解为一个无限容量且没有传输速度限制的网上云盘,但是这个云盘是可以设置公共与私密空间的,在这个开源的时代,你可以通过这个平台看到世界上许多其他大佬的程序作品,并且学习他们的编程思想,而且这很容易获得。
为什么需要向开源项目提交issue
作为开源项目的收益者:广大搬砖程序员们,能为开源项目做贡献是一种荣誉,为社区做贡献也有利于开源项目发展从而使更多的程序员收益.
怎么向开源项目提交issue
进入正题,起因是我在研究 fastjson2 项目库时发现在使用 2.0.18 版本com.alibaba.fastjson2.JSONObject 该类的 getDate 方法时出现了一些时间转换异常,代码如下
/**
* -*- coding = utf-8 -*-
*
* @Author: Created by rio on 2022/9/20 11:26
* @PACKAGE: test
* @Software: IntelliJ IDEA
*/
public class Application {
public static void main(String[] args) {
try {
String time = "2000-00-00 00:00:00";
com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
jsonObject.put("time", time);
System.out.println(jsonObject.getDate("time"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
pom 依赖如下
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.18</version>
</dependency>
调用结果如图所示
"2000-00-00 00:00:00" 在我们人类看来一个非法的时间戳究竟为何会变成1999年的12月1日呢,究竟是人性的扭曲,还是道德的沦丧
为了一探究竟我们深入源码 debug 发现在 com.alibaba.fastjson2.util 包下的 DateUtils 类负责完成字符串类型的日期转换,且该类的millis方法在不满足
if (zoneId != IOUtils.SHANGHAI_ZONE_ID && zoneId.getRules() != IOUtils.SHANGHAI_ZONE_RULES)
情况下会返回默认毫秒值 943977600000 ,而该值正等于1999-12-01 00:00:00.000,这相当于说再时区 id 等于 SHANGHAI_ZONE_ID 或 时区规则等于 SHANGHAI_ZONE_RULES 时 会给一个默认值,于是我们就看到了开头的 bug
提交 bug
那么既然我们发现了 bug,如何提交呢?
首先,进入github 开源仓库,如上图所示 可以看到仓库中的 Issues 标签点击 New issue
这里我们可以针对我们的问题进行选择,既然是 bug 我们就点击 bug 栏的 Get started,具体提交格式如下
### 问题描述
*简要描述您碰到的问题。*
### 环境信息
*请填写以下信息:*
- OS信息: [e.g.:CentOS 8.4.2105 4Core 3.10GHz 16 GB]
- JDK信息: [e.g.:Openjdk 1.8.0_312]
- 版本信息:[e.g.:Fastjson2 2.x.x]
### 重现步骤
*如何操作可以重现该问题:*
1. 使用 `xxx.xxx` 方法
2. 输入 `...` 数据
3. 出现 `...` 错误
```java
//可在此输入示例代码
```
### 期待的正确结果
*对您期望发生的结果进行清晰简洁的描述。*
### 相关日志输出
*请复制并粘贴任何相关的日志输出。*
#### 附加信息
*如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。*
我提交完毕之后的 issue 链接如下
[BUG] 输入错误的日期字符串时调用JSONObject.getDate方法输出超出预期 · Issue #912 · alibaba/fastjson2 · GitHub
问题的解决与自我提升
那么新版是如何解决的呢?通过简单的 debug 我们发现wenshao做了一个简单的判断,当月份不等于0 并且年份不等于 0 时则抛出异常,吐槽: 这个修 bug 的方式确实不敢恭维,为了兼顾 "0000-00-00 00:00:00" 这样的日期格式默认为Thu Jan 01 00:00:00 CST 1970 真的是煞费苦心....
那么根据这个逻辑是不是当年份为 0 而月份不为 0 时也能正常运行呢?我们继续探究
果然,我们又得到了一个异常的输出
更严重的问题是笔者在输入正常值的情况下居然有时也会抛出异常
"2022-11-09 18:34:00" = Wed Nov 09 18:34:00 CST 2022
"2022-12-09 18:34:00" = java.time.format.DateTimeParseException: illegal input at com.alibaba.fastjson2.util.DateUtils.toMillis19(DateUtils.java:2289) at com.alibaba.fastjson2.util.DateUtils.parseDate(DateUtils.java:41) at com.alibaba.fastjson2.JSONObject.getDate(JSONObject.java:1012) at test.Application.main(Application.java:20)
难道世界上不存在2022-12-09 18:34:00? 在分析了源码之后我们不难理解为什么会出现这种奇怪的报错,这也是为什么开源社区并不推荐使用 fastjson 的原因,即便重构到了 fastjson2 这种兼容代码也是非常难处理的,最后这个 bug 就当做小礼物留给有探索欲的同学提交 issue 吧!