Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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,Java.util.date解析后的年份错误_Java_Scala_Date_Simpledateformat_Java.util.date - Fatal编程技术网

Java,Java.util.date解析后的年份错误

Java,Java.util.date解析后的年份错误,java,scala,date,simpledateformat,java.util.date,Java,Scala,Date,Simpledateformat,Java.util.date,因此,几天前,我在旧的、糟糕的java.util.DateAPI中遇到了一个有趣的bug 在这个代码片段中,我们有3个不同的SimpleDataFormat,以及一些要分析的日期: val sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") val sdfPartname = new SimpleDateFormat("YYYY-MM-dd") val sdfShort = new SimpleDateFormat("yyMMddHHmm

因此,几天前,我在旧的、糟糕的
java.util.Date
API中遇到了一个有趣的bug

在这个代码片段中,我们有3个不同的
SimpleDataFormat
,以及一些要分析的日期:

val sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  val sdfPartname = new SimpleDateFormat("YYYY-MM-dd") 
  val sdfShort = new SimpleDateFormat("yyMMddHHmm")
  sdfShort.setTimeZone(TimeZone.getTimeZone("UTC"))

  val batchIdList = List(1912311300,1912301130,2001011300,1812311300,1612311300)
  batchIdList.foreach( batchId => {
    print("\nResult for input:" + batchId + "\n")
    val date = sdfShort.parse(batchId.toString).getTime
    print("dt: " + sdf.format(date) + "\n") 
    print("partname: " + sdfPartname.format(date) + "\n"))
  })
输出非常有趣:

Result for input:1912311300
dt: 2019-12-31 14:00:00
partname: 2020-12-31

Result for input:1912301130
dt: 2019-12-30 12:30:00
partname: 2020-12-30

Result for input:2001011300
dt: 2020-01-01 14:00:00
partname: 2020-01-01

Result for input:1812311300
dt: 2018-12-31 14:00:00
partname: 2019-12-31

Result for input:1612311300
dt: 2016-12-31 14:00:00
partname: 2016-12-31
我不知道这错误的一年背后是什么。你有什么想法吗


PS:当然,更改为
ZonedDateTime
解决了这个问题,但我仍然想知道
java.util.Date
为什么会这样工作。

y
!=<代码>Y。检查模式注意
yyyy
不是
yyy
。大写Y=周年,即周所在的年份。这可能与实际年份不同,小写y。看,这回答了你的问题吗?当然,强烈反对使用
SimpleDateFormat
Date
类。支持使用
java.time
包和
DateTimeFormatter
类。至于这个bug本身,它看起来确实像一个bug,我的直觉是它永远不会被修复,但是我看到在你的面具中你使用了“y”和“y”,这两个词在技术上是不同的,尽管相似。尝试在所有格式中切换到“Y”或“Y”,看看它是否能解决您的问题problem@MichaelGantman仅适用于java 8+用户