令人难以置信的Java时光机

3
使用此示例代码会有什么影响我的时间/日期?
package date;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormatTest
{
    public static void main(String args[]) throws ParseException
    {
        final String pattern = "dd/MM/YYYY HH:mm";
        final Locale locale = Locale.FRENCH;
        final SimpleDateFormat formatter = new SimpleDateFormat(pattern, locale);

        Date d = new Date();
        System.out.println("Today: " + d);

        String parsedDate = formatter.format(d);
        System.out.println("Today as string:" + parsedDate);

        Date d2 = formatter.parse(parsedDate);
        System.out.println("Today parsed back:" + d2);

    }
}

输出:

Today: Fri Jun 28 16:28:04 CEST 2013
Today as string:28/06/2013 16:28
Today parsed back:Mon Dec 31 16:28:00 CET 2012    >>> ????

忘记输出了。刚刚编辑了问题! - remi
没有什么玄机:我获取当前日期,使用格式化程序将其解析为字符串,然后使用相同的格式化程序将此字符串转换回日期,返回的日期与原始日期不同。 - remi
2
YYYY 应该改为 yyyy - fge
2个回答

10
pattern = "dd/MM/YYYY HH:mm";

应该是

pattern = "dd/MM/yyyy HH:mm";

请查看JavaDoc

但请注意,您发布的此代码甚至无法在我的Eclipse上运行:

java.lang.IllegalArgumentException: Illegal pattern character 'Y'

啊,Java 7中添加了Y。但它是 weekyear


根据 OP 的评论:「我获取当前日期,使用格式化程序将其解析为字符串,然后再使用相同的格式化程序将此字符串转换回日期,返回的日期与原始日期不同」。YYYY 看起来像是 OP 在撰写问题时的笔误,并不是真正的问题。=\ - Luiggi Mendoza
太快了!确实是个好答案,不过需要等几分钟才能接受它。谢谢! - remi
@remi 很高兴能帮忙,但老实说我还没有完全理解周年概念。 - zw324
我仍然不明白为什么解析后的日期与原始日期不同。 - WilQu
@WilQu 我也不知道。我原本认为是因为 format(Date) 方法是从 DateFormat 继承而来,并且在 SimpleDateFormat 中没有被重写,但是在 SimpleDateFormat 类中定义的 format(Date, StringBuffer, FieldPosition) 方法也表现相同。进一步的解释可能需要深入研究 JDK 源代码。 - zw324
@WilQu 我不是完全有信心理解了它,但从提供的链接中所说的来看,2013年的第一周实际上是从12月31日开始的,直到2014年的第一周(即2013年12月30日开始)之前的所有周都具有相同的“周年”值(2013)。我猜尝试解析包含周年值的字符串会忽略其他所有内容(因为没有办法同时解决两者),因此得到的日期只是该年第一周的第一天。 - Anthony Grist

1
作为周年解释,我猜测由于错误的模式2013 -> YYYY,解析2013年的周年会将整个日期设置为2013年的第一周,即2012年12月31日星期一。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接