从日期中删除日期名称并将其设置为仅 '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

详情

您使用的 类,DateSimpleDateFormat,自 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