【发布时间】:2018-10-16 19:48:13
【问题描述】:
我知道SimpleDateFormat.parse 依赖于日历 API,它依赖于本地 JVM 时区(计算机)。假设 JVM 时区是 IST。
SimpleDateFormat srcDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
srcDateFormat.setTimeZone(TimeZone.getTimeZone("EST"));
Date objDt = srcDateFormat.parse("2018-10-16 11:28:25"); //Time : 21:58:25
从输出看来,它从 EST 转换为 IST(JVM 本地时区)。
SimpleDateFormat srcDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
srcDateFormat.setTimeZone(TimeZone.getTimeZone("IST"));
Date objDt = srcDateFormat.parse("2018-10-16 11:28:25"); //Time : 11:28:25
在这种情况下,它保持时间不变。在这种情况下,我将时区设置为与 JVM 本地时区相同。
请帮助我理解parse 方法的行为。不过,我很想知道这种行为背后的原因。
我知道java.util.Date 和java.text.SimpleDateFormat 遗留类现在已经过时了。
参考资料:
- Why SimpleDateFormat.format() and SimpleDateFormat.parse() are giving different time though setting only one TimeZone?
- How do I convert date/time from one timezone to another?
- SimpleDateFormat parses a string to wrong time
- https://www.codeproject.com/Tips/1190426/When-Parsing-Formatting-Dates-in-Java-Make-Sure-Yo
【问题讨论】:
-
这与 parse() 方法无关。它是关于 Date 的 toString() 方法,它总是使用默认时区格式化日期。就像,即使您使用法语数字格式将字符串
"1,23"解析为双精度,并打印双精度,它也将始终打印为1.23,因为格式化双精度的默认方式是使用英文格式(即使用点而不是逗号作为小数分隔符)。 -
我认为 java.util.Date 不包含任何时区信息。您的示例与区域设置更相关。
-
这正是它的 toString() 方法需要选择一个时区来将其转换为字符串的原因。并且选择的时区是默认时区。就像 toString 方法必须选择一个语言环境来将双精度转换为字符串,而选择的是英语语言。
-
如果上述观点为真,那么在第二种情况下,为什么它没有再次转换为 IST?日期字符串中没有时区相关信息。
-
嗯,默认时区是 IST,您使用 IST 时区解析时间 11:28:25,当您打印日期时,使用默认 IST 时区,您会得到 11:28: 25.这是正确的时间,在 IST 时区。不知道你认为它应该是什么,也不知道为什么。
标签: java date datetime timezone simpledateformat