代码之家  ›  专栏  ›  技术社区  ›  Dhruv Kapatel

SimpleDataFormat解析方法

  •  0
  • Dhruv Kapatel  · 技术社区  · 8 年前

    我知道 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 遗留类现在已经过时了。

    参考文献:

    1 回复  |  直到 8 年前
        1
  •  2
  •   Anonymous    8 年前

    Date 和 SimpleDateFormat 是遗留类,现在已过时。因此,我建议您不要使用它们,而是使用java.time,即现代的java日期和时间API。在许多优点中,它对于时区之间的转换更为明确,我希望这能帮助您理解代码的作用。

    1. Instant (java.time中的一个类)是一个时间点,据我所知,您应该在这里使用这个时间点。
    2. 不要使用三个字母的时区缩写。其中很多都是模棱两可的,包括IST和EST,后者不是一个真正的时区,所以你在一年中的这个时候会得到什么(当美国/纽约地区使用EDT而不是EST时),我不知道。
    3. 重复我的话,用现代的课程,而不是过时的课程。

    老式的 表示独立于时区的时间点(在内部,它将其值存储为自epoch以来的毫秒计数,但这是一个我们不需要知道或关心的实现细节)。

    日期 在调试器中,调试器调用 toString 上 日期 找根绳子给你看。 反过来,使用JVMs时区来生成字符串。在你的情况下是亚洲/加尔各答,这就是为什么你得到21:58:25。

    托斯特林 ,它再次使用JVM时区并转换回11:28:25。当你在同一时区进行解析和打印时,你会得到一天中相同的时间。

    链接