java - 无法在Java中将字符串转换为日期,转换后时区错误

标签 java date datetime java-8 date-comparison

我有一个包含日期的字符串数组,例如:

  • 2016 年 2 月 9 日星期二 14:07:00 GMT
  • 2016 年 2 月 9 日星期二 19:55:00 GMT

现在我想查找此列表中的最新日期。为此,我尝试将这些字符串反序列化为 java.util.Date 对象,然后比较它们。

java.util.Date对象生成的代码示例:

strDate = "Tue, 09 Feb 2016 14:07:00 GMT";
DateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");

Date date;
try {

    date = format.parse(strDate);

    //Result: Tue Feb 09 16:07:00 IST 2016
    System.out.println("Result: " + date.toString());

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

我的问题:

  1. 为什么结果是IST 2016时区而不是GMTIST 2016 代表什么?是印度标准时间爱尔兰标准时间还是以色列标准时间

  2. 初始字符串采用 EEE, dd MMM 格式,SimpleDateFormat 模式也是这种格式,因此,为什么结果采用 EEE、MMM dd 格式?

  3. 如何获取与初始字符串处于同一时区的 java.util.Date 对象(在我的例子中 - GMT

  4. 我用来查找列表中最新日期的方法是否可以,或者在 Java 8 中有更方便/现代的方法来实现这一点,例如,使用 LocalDateTime

最佳答案

当您应该使用格式化程序将日期格式化为 String 时,您依赖于 Date.toString() 来打印日期。您所看到的只是 Date.toString() 的默认模式。您必须记住的是,Date 没有时区。您看到的输出带有 IST 时区,这一定是因为 JVM 的当前区域设置被设置为时区名称为“IST”的某个特定区域设置。

关于你的第4点,是的,你可以使用Java 8中引入的Java Time API来做得更干净。你可以创建一个要解析的字符串的List,创建一个 DateTimeFormatter 来解析它,并保留最大日期值。

public static void main(String[] args) {

    List<String> dates = Arrays.asList("Tue, 09 Feb 2016 14:07:00 GMT", "Tue, 09 Feb 2016 19:55:00 GMT");
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
    
    ZonedDateTime maxDate = dates.stream()
                                 .map(s -> ZonedDateTime.parse(s, formatter))
                                 .max(ZonedDateTime::compareTo)
                                 .get(); // or .orElse(null)
    
    System.out.println(maxDate);
}

此代码使用 ZonedDateTime 来保留传入字符串的时区。

关于java - 无法在Java中将字符串转换为日期,转换后时区错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35295968/

相关文章:

java - 不能重用方法android OOP

java - #define STRING 在 Tomcat Java App 中等效

java - java 是否可以在二分查找中检查特殊字符?

使用 JQL 进行日期计算和格式化

date - 将 datetime.now().date() 与 Python 中的日期常量进行比较

java - 如何将 currentTimeMillis 转换为可读的日期格式?

java - 如何将日期字符串转换为时区

java - 在 java 8 jdk 中放置/获取 HashMap 复杂性

linux - 毫秒到 Excel 导致日期相差 4 年

datetime - ColdFusion 中是否有日期/时间的自然语言解析器?