没有时间的日期不会隐藏秒数

Date without time doesn't hide seconds

我正在使用 Joda Time 从日期中删除秒数。

首先,我有这种Date:

Thu Nov 05 00:00:00 CET 2020

我使用这种方法从本地数据库中选择这个日期:

public static Date dateTimeFromString(String s) {

    String pattern = "yyyy-MM-dd";
    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    Date d= null;
    try {
        d = sdf.parse(s);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return d;

从那天起,我将达到这样的形式:

Thu Nov 05 CET 2020

或者像这样更好:Thu Nov 05 2020.

现在,我正在尝试使用 Joda Time:

中的这个方法
private Date dateWitoutTime(Date date){
    return new LocalDate(date).toDate();
}

但仍然得到

Thu Nov 05 00:00:00 CET 2020

有什么帮助吗?谢谢。

不要用遗留的 error-prone java.util date-time API 污染干净的 java.time API。您可以使用 modern date-time API:

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now.format(DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm", Locale.ENGLISH)));
        System.out.println(now.format(DateTimeFormatter.ofPattern("EEE MMM dd uuuu", Locale.ENGLISH)));

        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z uuuu", Locale.ENGLISH);
        ZonedDateTime givenDateTime = ZonedDateTime.parse("Thu Nov 05 00:00:00 CET 2020", dtfInput);

        DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("EEE MMM dd z uuuu", Locale.ENGLISH);
        System.out.println(givenDateTime.format(dtfOutput));
        System.out.println(ZonedDateTime.now(ZoneId.of("Europe/Paris")).format(dtfOutput));
    }
}

输出:

04-Nov-2020 17:13
Wed Nov 04 2020
Thu Nov 05 CET 2020
Wed Nov 04 CET 2020

Trail: Date Time.

了解有关现代 date-time API 的更多信息

使用旧版 API:

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

public class Main {
    public static void main(String[] args) throws ParseException {
        Date now = new Date();
        System.out.println(new SimpleDateFormat("dd-MMM-yyyy HH:mm", Locale.ENGLISH).format(now));
        System.out.println(new SimpleDateFormat("EEE MMM dd yyyy", Locale.ENGLISH).format(now));

        SimpleDateFormat sdfInput = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
        Date givenDateTime = sdfInput.parse("Thu Nov 05 00:00:00 CET 2020");

        SimpleDateFormat sdfOutput = new SimpleDateFormat("EEE MMM dd z yyyy", Locale.ENGLISH);
        sdfOutput.setTimeZone(TimeZone.getTimeZone("CET"));
        System.out.println(sdfOutput.format(givenDateTime));
        System.out.println(sdfOutput.format(now));
    }
}

输出:

04-Nov-2020 17:13
Wed Nov 04 2020
Thu Nov 05 CET 2020
Wed Nov 04 CET 2020

如果您使用的是 Java8+,则不需要 JodaTime。

一个Date实例包含时间;没有办法解决这个问题。也许您想 return 改为 String

    // Pre-Java8
    private String dateWithoutTime(final Date date) {
        final SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM d yyyy");
        return sdf.format(date);
    }

    // Java8+
    private String dateWithoutTime(final LocalDate date) {
        final DateTimeFormat formatter = DateTimeFormatter.ofPattern("EEE MMM d yyyy");
        return date.format(formatter);
    }

    private String dateWithoutTime(final Date date) {
        final LocalDate localDate = convertDateToLocalDate(date);
        return dateWithoutTime(localDate);
    }

    private LocalDate convertDateToLocalDate(final Date date) {
        ...
    }

I want a String, …

好吧,从一种字符串格式转换为另一种字符串格式有点不对劲。正如您将数字保存在 int 变量中并将布尔值保存在 boolean 变量中(我希望),您应该将日期保存在 LocalDate 变量中,或者是 LocalDate class 来自 Joda-Time 或来自 java.time 的现代 Java 日期和时间 API 已取代 Joda-Time。但是既然你问了,那就让你的方法 return a String:

private static final DateTimeFormatter dateFormatter
        = DateTimeFormat.forPattern("EEE MMM dd yyyy").withLocale(Locale.ENGLISH);

public static String dateTimeFromString(String s) {
    LocalDate date = LocalDate.parse(s);
    return date.toString(dateFormatter);
}

让我们试试看:

    System.out.println(dateTimeFromString("2020-11-05"));

输出:

Thu Nov 05 2020

我已经为格式化程序指定了语言环境,以确保打印的缩写是英文的。

您不能将 DateLocalDate 打印为 Thu Nov 05 2020。这些 classes 的 toString 方法被定义为打印特定格式。您只能在 String 中使用您选择的格式。这很好:它有助于将模型和演示文稿分开。