在Java中表示日期的最佳方法

5

我正在设计一个预订系统,需要仅表示2015年的日期,格式为“dd,mmm,2015”(例如“05 Jan 2015”)。 我有点困惑如何做到这一点,看起来Date支持这样的东西,但现在已被弃用? 我还对公历日历类GregorianCalender感到困惑。 GregorianCalender(2015,01,05)是2015年日期的表示还是另一个完全不同的对象?


1
你所说的日期表示是指拥有一个日期对象,并且想要以“dd mmm 2015”格式的字符串形式显示它吗? - Mooolo
这是一个房间预订系统,因此我想表示房间已预订的日期并检查房间是否未被预订等。但我也希望日期在2015年内有效。 - Massin
2
Java 8中的LocalDate类是一个非常好的选择。如果您使用较低版本的Java,则可以查看JodaTime库。http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html - Erwin Bolwidt
1
如果您正在使用Java 8,则请使用新的Time API,否则请使用JodaTime。Java Date没有格式概念,它只是自Unix纪元以来的毫秒数。使用SimpleDateFormat将日期实际格式化为您想要的任何格式... - MadProgrammer
使用一个日期模块,它允许您格式化日期。然后选择 YYYY/MM/DD 格式,因为这样您可以将它们转换为整数,并只使用条件运算符来确定一个日期是否等于、小于或大于另一个日期等。 - Ogen
你会做这样的事情吗?SimpleDateFormat("yyyy.mmm.dd") LocalDate.of(2015, jan, 05)? - Massin
4个回答

6

java.time.LocalDate

如果您正在使用Java 8或更高版本,应该使用java.time.LocalDate类。

要解析和格式化此日期,需要使用java.time.format.DateTimeFormatter类。

用法示例:

LocalDate date = LocalDate.of(2015, Month.JANUARY, 5);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd, MMM, yyyy", Locale.ENGLISH);
System.out.println(formatter.format(date)); // prints "05, Jan, 2015"
date = LocalDate.parse("06, Jan, 2015", formatter);
System.out.println(date.getDayOfMonth()); // prints "6"

如果您使用的是Java 7或更早版本,则应使用java.util.Date类来表示日期,使用java.util.GregorianCalendar来从字段创建日期对象或检索日期组件,并使用java.text.SimpleDateFormat来解析和格式化。 使用示例:
GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.set(2015, Calendar.JANUARY, 5);
Date date = gregorianCalendar.getTime();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd, MMM, yyyy", Locale.ENGLISH);
System.out.println(simpleDateFormat.format(date)); // prints "05, Jan, 2015"
date = simpleDateFormat.parse("06, Jan, 2015");
gregorianCalendar.setTime(date);
System.out.println(gregorianCalendar.get(Calendar.DAY_OF_MONTH)); // prints "6"

1
第一部分很明智,使用java.time类。至于第二部分,关于Java 7和Java 6,我建议人们添加在ThreeTen-Backport项目中找到的大多数java.time功能的后移版本。API与java.time几乎相同。因此,无需学习两个不同的框架。更重要的是,那些遗留的类(DateCalendarGregorianCalendar)是非常糟糕的类,设计令人震惊,非常混乱,使用起来令人沮丧。 - Basil Bourque

1

Java 8日期和时间API为您提供了许多关于日期和时间使用的灵活性。 了解更多Java 8日期和时间


0

我不确定你在哪里看到了这个弃用警告,但我仍然会使用Date和DateFormat对象。

DateFormat format = new SimpleDateFormat("dd MM");
String output;

output = format.format(new Date()) + " 2015";
System.out.println(output);

输出:

06 04 2015

如果你想删除0,将代码更改为以下内容:
    DateFormat format = new SimpleDateFormat("dd MM");
    String output;

    output = format.format(new Date());
    output = output.replaceAll("0", "") + " 2015";
    System.out.println(output);

输出:

6 4 2015

关于SimpleDateFormat的更多信息,请参考javadoc文档:SimpleDateFormat参考文档


1
如果您不想要零,则只需使用“d M”或“d M yyyy”。您的代码在每个月的10日、20日和30日以及整个十月份都会出现严重错误。当然,除了它只适用于2015年这一事实之外。 - Dawood ibn Kareem
你抓住我了。是的,它只能在2015年有效;这就是问题所要求的。 - maxbfuer
我不确定你在哪里看到了被弃用的内容。提问者可能正在查看其中一个已弃用的构造函数。无论如何,Date 的设计很差且令人困惑,尽管它的名称是“日期”,但它并不代表日期。它也已经过时、陈旧、过时了。虽然还没有正式被弃用,但我们将受益于将其视为已弃用。 - Ole V.V.
@OleV.V.,它仍然在许多API中使用,例如java.securityjava.sqljava.util.Timer和许多其他类。废弃所有这些将需要相当大的工作量。虽然不应在新代码中使用它,但对于一些现有代码来说,它是不可避免的。值得庆幸的是,在java.time.*java.util.Date之间进行转换非常简单。 - vbezhenar
1
@vbezhenar 一般正确。不过他们可以轻松地弃用java.sql中的用法。自从JDBC 4.2以来,我们可以将java.time对象传递到SQL并从SQL中获取它们。 - Ole V.V.

0

这将以年月日的形式获取今天的日期作为一个int。您可以使用此int来比较日期。例如,dateInt_1 < dateInt_2表示date1date2之前。dateInt_1 == dateInt_2表示两个日期相同。等等。

int dateInt = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接