当前位置: 首页 > 知识库问答 >
问题:

SimpleDateFormat在小时为12时转换日期不正确的返回值[重复]

宗政博
2023-03-14

我在将json文件中的日期转换为时间戳时遇到问题。当小时=12时,返回的时间戳不正确。

Java版本1.8.0\u 171

使用下面的代码片段,我希望输出是

2017-07-19 07:43:42.0

2017-07-18 08:43:42.0

2017-07-19 09:43:42.0

相反,我得到了

2017-07-19 07:43:42.0

2017-07-18 20:43:42.0

2017-07-19 09:43:42.0

我已经在两台机器上试过了,并让一位同事运行了它,同样的结果任何人都能看到问题所在;我可能正盯着它看

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Locale;
import org.apache.commons.lang3.StringUtils;

public class TimestampTest {

    public static void main(String[] args) {

        String input = "2017-07-19T11:43:42.000+0000";
        System.out.println(stringToTimestamp(input));

        input = "2017-07-19T12:43:42.000+0000";
        System.out.println(stringToTimestamp(input));

        input = "2017-07-19T13:43:42.000+0000";
        System.out.println(stringToTimestamp(input));

    }

    private static Timestamp stringToTimestamp(String input) {
        try {   
            if(StringUtils.isBlank(input)) {
                return null;
            }
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ",
                Locale.getDefault());
            java.util.Date parsedDate = dateFormat.parse(input);
            Timestamp timestamp = new java.sql.Timestamp(parsedDate.getTime());
            return timestamp;

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
}

共有2个答案

宓诚
2023-03-14

这是因为您使用的是默认情况下宽松的SimpleDataFormat。如果通过设置“宽大处理”(错误)关闭宽大处理:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ", Locale.getDefault());
dateFormat.setLenient(false);

您将得到一个异常,显示:

java.text.ParseException: Unparseable date: "2017-07-19T13:43:42.000+0000"

这里的根本原因是,您提交的小时数为13小时,需要的是HH模式,而不是HH模式。由于宽大,您的代码会自动修复日期,而不是引发异常。

小时(0-23)

h小时在上午/下午(1-12)

席兴朝
2023-03-14

除了您不应该再使用DateSimpleDateFormat之外,您的错误是因为您使用的是hh而不是HH

h类-

H-

考虑在您的案例中使用LocalDateTime。

 类似资料: