【问题标题】:Java, converting Date to String and back produced wrong DateJava,将日期转换为字符串并返回产生错误的日​​期
【发布时间】:2012-06-28 14:51:33
【问题描述】:

我正在尝试将Date 转换为String,然后再转换回Date。但是我发现最后的日期和原来的日期不一样,是什么原因?

    //1975-06-20
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 1975);
    cal.set(Calendar.MONTH, 5);
    cal.set(Calendar.DAY_OF_MONTH, 20);
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    System.out.println(cal);

    Date originalDate = cal.getTime();
    System.out.println("Date 1: " + originalDate.toString());

    SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
    Date date = sdf.parse(originalDate.toString());
    System.out.println("Date 2: " + date.toString());

上面代码的输出是:

cal: java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Singapore",offset=28800000,dstSavings=0,useDaylight=false,transitions=9,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=1975,MONTH=5,WEEK_OF_YEAR=26,WEEK_OF_MONTH=5,DAY_OF_MONTH=20,DAY_OF_YEAR=179,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=0,HOUR_OF_DAY=16,MINUTE=0,SECOND=0,MILLISECOND=333,ZONE_OFFSET=28800000,DST_OFFSET=0]
Date 1: Fri Jun 20 12:00:00 SGT 1975
Date 2: Fri Jun 20 11:30:00 SGT 1975

【问题讨论】:

  • Calendar 是区域设置感知的,而 Date 不是。见this post for more info
  • 没有 DateFormat.format(String, String) 方法。您的代码无法编译。格式化日期的 toString() 表示有什么意义?为什么要解析 originalDate 的 toString() 而不是解析格式化的日期?
  • @Brad, it isn't?
  • 您对DateFormat.format() 的调用与Java API 不匹配:docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html
  • @JB Nizet 和@Hugo,你是对的。第一种方法是我的团队创建的实用程序类。它也使用SimpleDateFormat。我已将其从问题中删除以避免混淆。但我的问题仍然有效..

标签: java date-format simpledateformat


【解决方案1】:

可能是因为 1982 年新加坡的时区变化(+ 30 分钟)。

http://www.timeanddate.com/worldclock/timezone.html?n=236&syear=1980

SimpleDateFormat在解析日期时将SGT作为UTC+8,将其转换为UTC+7.5,即1982年之前的SGT,因此日期相差30分钟。

【讨论】:

  • 这解释了 30 分钟的差异,但没有解释为什么在使用 cal.set(Calendar.HOUR, 0) 设置时,原始时间的“小时”显示为 12。 @Rosdi,这是您的问题中的错字吗?
  • @Brad:由于HOUR 是上午/下午的时间(12 小时循环),并且新加坡目前是下午(这会影响.getInstance()),所以它设置为下午 12 点代码将HOUR 设置为0。HOUR_OF_DAY 将把小时设置为一天24 小时。
【解决方案2】:

您确定您粘贴的代码正确吗?

日期日期 = DateFormat.format(originalDate.toString(), "EEE MMM dd HH:mm:ss zzz yyyy");

似乎有问题:据我所知,没有带有签名 Date DateFormat.format(String, String) 的方法

【讨论】:

  • 我已经删除了那部分。这是我的团队创建的实用程序类。对于那个很抱歉。但我的问题仍然有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2019-06-10
  • 1970-01-01
  • 2021-09-19
  • 2011-06-13
  • 2019-07-13
  • 1970-01-01
相关资源
最近更新 更多