从日期中删除日期名称并将其设置为仅 'yyyy-MM-dd HH:mm:ss'
Remove the day name from date and set it as only 'yyyy-MM-dd HH:mm:ss'
我试图以 yyyy-MM-dd HH:mm:ss 格式获取当天早上 6 点的日期,但它显示为:12 月 20 日星期三 06:00:00 CST 2017
这是我的代码:
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd 06:00:00");
Date date0 = new Date();
String x = dateFormat.format(date0);
try{
DateFormat formatter ;
Date date ;
formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date = formatter.parse(x);
}
catch (Exception e){}
java.util.Date
是自 Unix Epoch 以来毫秒数的容器,它不维护任何类型的内部格式概念,相反,当您打印它时,它使用 Date#toString
它通常使用当前 Locale
来提供值的人类可读表示。
虽然我确定您可以继续使用 Date
来完成这项工作,但更简单的方法是利用更新的 Date/Time API,像...
LocalDateTime now = LocalDateTime.now();
LocalDateTime then = now.withHour(6).withMinute(0).withSecond(0).withNano(0);
String formatted = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(then);
System.out.println(formatted);
对我来说,打印出 2017-12-21 06:00:00
解析后需要格式化如下:formatter.format(date)
。所以修改你的代码如下:
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd 06:00:00");
Date date0 = new Date();
String x = dateFormat.format(date0);
try{
DateFormat formatter ;
Date date ;
formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date = formatter.format(formatter.parse(x));
}
catch (Exception e){}
TL;DR
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
LocalDate date0 = LocalDate.now(ZoneId.of("America/Winnipeg"));
String at6Am = date0.atTime(LocalTime.of(6, 0)).format(formatter);
System.out.println(at6Am);
运行刚才打印了这个
2017-12-21 06:00:00
详情
您使用的 类,Date
和 SimpleDateFormat
,自 Java 1.0 以来已经存在了大约 20 年。事实证明,它们的设计很差,使用起来也很麻烦。也许也是出于这个原因,关于它们的文章很多,通过搜索网络,您很容易得到这些是您应该使用的 类 的印象。相反,它们是您应该避免的 类。他们的替代品出来了 Java 8,马上就要 4 年前了。
格式化程序用于格式化和解析。您不应该使用一个格式化程序,更不用说两个格式化程序,来将一天中的时间更改为早上 6 点。
世界上任何地方的日期都不同。所以获取今天的日期是一个依赖于时区的操作。我在我的代码中明确了时区,因此 reader 也将意识到这一事实。如果不是 America/Winnipeg,请替换为您想要的时区。
您正在修改现有软件。如果你从中得到一个老式的 Date
对象,首先将它转换为现代的 Instant
类型,然后使用现代的 API 进行进一步的操作。例如:
Date date0 = getOldfashionedDateFromLegacyApi();
String at6Am = date0.toInstant()
.atZone(ZoneId.of("America/Winnipeg"))
.with(LocalTime.of(6, 0))
.format(formatter);
你的代码出了什么问题?
我不认为你问题中的代码有任何问题。您希望日期时间格式为 2017-12-20 06:00:00,并且您在第三行代码的字符串 x
中得到了它。对此感到满意并省略其余代码。
没有将格式强加于日期时间对象这样的事情(无论我们谈论的是过时的还是现代的 API)。格式化日期时间意味着将其转换为所需格式的 String
。
我试图以 yyyy-MM-dd HH:mm:ss 格式获取当天早上 6 点的日期,但它显示为:12 月 20 日星期三 06:00:00 CST 2017
这是我的代码:
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd 06:00:00");
Date date0 = new Date();
String x = dateFormat.format(date0);
try{
DateFormat formatter ;
Date date ;
formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date = formatter.parse(x);
}
catch (Exception e){}
java.util.Date
是自 Unix Epoch 以来毫秒数的容器,它不维护任何类型的内部格式概念,相反,当您打印它时,它使用 Date#toString
它通常使用当前 Locale
来提供值的人类可读表示。
虽然我确定您可以继续使用 Date
来完成这项工作,但更简单的方法是利用更新的 Date/Time API,像...
LocalDateTime now = LocalDateTime.now();
LocalDateTime then = now.withHour(6).withMinute(0).withSecond(0).withNano(0);
String formatted = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(then);
System.out.println(formatted);
对我来说,打印出 2017-12-21 06:00:00
解析后需要格式化如下:formatter.format(date)
。所以修改你的代码如下:
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd 06:00:00");
Date date0 = new Date();
String x = dateFormat.format(date0);
try{
DateFormat formatter ;
Date date ;
formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date = formatter.format(formatter.parse(x));
}
catch (Exception e){}
TL;DR
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
LocalDate date0 = LocalDate.now(ZoneId.of("America/Winnipeg"));
String at6Am = date0.atTime(LocalTime.of(6, 0)).format(formatter);
System.out.println(at6Am);
运行刚才打印了这个
2017-12-21 06:00:00
详情
您使用的 类,Date
和 SimpleDateFormat
,自 Java 1.0 以来已经存在了大约 20 年。事实证明,它们的设计很差,使用起来也很麻烦。也许也是出于这个原因,关于它们的文章很多,通过搜索网络,您很容易得到这些是您应该使用的 类 的印象。相反,它们是您应该避免的 类。他们的替代品出来了 Java 8,马上就要 4 年前了。
格式化程序用于格式化和解析。您不应该使用一个格式化程序,更不用说两个格式化程序,来将一天中的时间更改为早上 6 点。
世界上任何地方的日期都不同。所以获取今天的日期是一个依赖于时区的操作。我在我的代码中明确了时区,因此 reader 也将意识到这一事实。如果不是 America/Winnipeg,请替换为您想要的时区。
您正在修改现有软件。如果你从中得到一个老式的 Date
对象,首先将它转换为现代的 Instant
类型,然后使用现代的 API 进行进一步的操作。例如:
Date date0 = getOldfashionedDateFromLegacyApi();
String at6Am = date0.toInstant()
.atZone(ZoneId.of("America/Winnipeg"))
.with(LocalTime.of(6, 0))
.format(formatter);
你的代码出了什么问题?
我不认为你问题中的代码有任何问题。您希望日期时间格式为 2017-12-20 06:00:00,并且您在第三行代码的字符串 x
中得到了它。对此感到满意并省略其余代码。
没有将格式强加于日期时间对象这样的事情(无论我们谈论的是过时的还是现代的 API)。格式化日期时间意味着将其转换为所需格式的 String
。