我创建了几个小方法作为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,但没有帮助。 有什么建议吗?
顺便说一下,这是我的环境:答案 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,因此没有理由对长期过时的类SimpleDateFormat
,Date
和Calendar
进行操作。现代课程通常更好用。我还可以自由地从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