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

时间:2016-02-09 15:35:01

标签: java date datetime java-8 date-comparison

我有一个Strings数组,其日期如:。

  • 星期二,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 时区的结果而不是 GMT IST 2016 代表什么?是印度标准时间爱尔兰标准时间以色列标准时间
  2. 初始字符串采用EEE, dd MMM格式,SimpleDateFormat模式也采用此格式,因此结果为EEE, MMM dd格式?
  3. 如何在与我的情况相同的时区中获取java.util.Date对象 - GMT
  4. 我用来查找列表中最新日期的方法是否正常,或者在Java 8中有更方便/现代的方法,例如,使用LocalDateTime

2 个答案:

答案 0 :(得分:5)

当您使用格式化程序将其格式化为Date.toString()时,您依赖String打印日期。您所看到的只是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来保留传入字符串的时区。

答案 1 :(得分:0)

您的计算机似乎设置为public ActionResult GetAllAbstracts(string categoryname) { List<Abstracts> abstracts = Helpers.SchedOrgHelpers.LoadAbstracts(); abstracts = abstracts.Where(x => x.Category == categoryname).ToList(); //Populate the Viewbag using the helpers method ViewBag.abstracts = abstracts; return View("...."); } 。要强制IST输出,请导入GMT并在java.util.TimeZone块中执行此操作:

try