Calendar.getInstance提供错误的日期

时间:2017-07-06 10:24:08

标签: java date calendar

我创建了几个小方法作为Util类,如下面的代码:

public class Util
{
  public static final String DATETIME_PATTERN="YYYY/MM/DD - HH:mm:ss";

  public static String getDateTime()
  {
    SimpleDateFormat sdf=new SimpleDateFormat(DATETIME_PATTERN);
    return sdf.format(getToday());
  }

  public static Date getToday()
  {
    //Calendar today=Calendar.getInstance(); //didn't help
    Calendar today=Calendar.getInstance(Locale.TAIWAN); //didn't fix
    //Calendar today=Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00")); //didn't fix as well
    return today.getTime();
  }
}

而且,做了一个非常简单的运行,像这样:

//run in main class
System.out.println("Generating sitemap.xml, please wait..."+Util.getDateTime());

结果是非常奇怪的日期 - > 2017/07 /的 187

//Console result:
Generating sitemap.xml, please wait...2017/07/187 - 15:27:21

搜索了类似的问题,并尝试了TimeZone,Locale,但没有帮助。 有什么建议吗?

顺便说一下,这是我的环境:

  • Windows7 x86
  • JDK 1.8.0.131 x86
  • eclipse oxygen x86

2 个答案:

答案 0 :(得分:5)

James Owen’s answer是正确的:您需要在格式模式字符串中使用小写yyyy和小写dd。应该这样做。

我想在这里贡献的是您的实用程序类的现代和改进版本:

public class Util
{
    public static final String DATETIME_PATTERN = "yyyy/MM/dd - HH:mm:ss";

    public static String getDateTime()
    {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(DATETIME_PATTERN);
        return getNow().format(dtf);
    }

    public static ZonedDateTime getNow()
    {
        return ZonedDateTime.now(ZoneId.of("Asia/Taipei"));
    }
}

由于您使用的是Java 8,因此没有理由对长期过时的类SimpleDateFormatDateCalendar进行操作。现代课程通常更好用。我还可以自由地从getToday()返回更多信息(并将其重命名为getNow):它现在告诉您当前时间和时区,这样可以确保{{1}也会格式化此时区的时间。

我首选getDateTime()作为时区。它给出与Asia/Taipei相同的结果,但(1)是未来的,如果台湾再次介绍夏令时(DST)(2)更清楚阅读并告诉读者更多关于为什么选择这个特定的偏移(台湾有有过夏天的时间,上次是在1979年。)

GMT+08:00

的问题示例

对于旧班级的许多反对意见中的一个是他们倾向于假装一切都很好。您的输出不正确,没有解释原因。您可能更喜欢一些错误消息。现代课程在这一点上表现得更好一些。假设您已将模式字符串与我的代码一起使用。它给出了

  

java.time.DateTimeException:Field DayOfYear无法打印为   值187超过最大打印宽度2

一年中的某一天?您可能需要检查the documentation以查看资金SimpleDateFormat是针对哪一天的,而D是针对某几天的日期。我们来修理:

d

不幸的是,public static final String DATETIME_PATTERN = "YYYY/MM/dd - HH:mm:ss"; 没有捕获您的其他错误,即大写DateTimeFormatter。这意味着以周为基础的年份,仅适用于周数。但理论上你可能有此意图,班级没有机会说出来。如果您尝试使用相同的格式进行解析,则会被告知您不能。

如果您需要YYYY

对于某些您无法更改的旧API,可能需要一个Date对象。在Java 8中,旧类已经安装了转换方法,所以很容易(当你知道如何)。例如,您可以添加此方法:

Date

答案 1 :(得分:3)

格式化日期的方式存在问题。 尝试将其更改为

@echo off
echo this is one line
choice /c q /d q /t 1 >nul
echo this is the second line