我想从Java日期中获取年,月,日等信息,以便与Java中的公历日期进行比较。这可能吗?


231

我在Java中有一个Date对象,它存储为Java的Date类型。

我也有一个公历创建日期。阳历日期没有参数,因此是今天日期(和时间?)的一个实例。

使用Java日期,我希望能够从Java日期类型中获取年,月,日,小时,分钟和秒,并比较gregoriancalendar日期。

我看到,目前Java日期存储为long,唯一可用的方法似乎只是将long作为格式化的日期字符串编写。是否可以访问年,月,日等?

我看到了getYear()getMonth()对等的方法Date类已被弃用。我想知道在日期中使用Java Date实例的最佳实践是什么GregorianCalendar

我的最终目标是进行日期计算,以便可以检查Java日期是否在今天的日期和时间的数小时,数分钟之内。

我仍然是Java的新手,对此感到有些困惑。


1
嘿,无论您使用什么,都不要使用。Date.getYear()它有很多问题(我不知道)。Date.getYear()一次解析了我的日期2017年6月30日,并将我的年份返回为117。看看它降落的地点,距今已有两千多年的历史了。但是当我只打印Date对象时,输出就很好了Date.getYear();
Seenivasan

仅供参考:您正在使用麻烦的旧的Date-time类,这些类现在已被遗留,由现代的java.time类取代。
罗勒·布尔克

Answers:


545

使用类似:

Date date; // your date
// Choose time zone in which you want to interpret your Date
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
// etc.

当心,月份从0开始,而不是1。

编辑:由于Java 8,最好使用java.time.LocalDate而不是java.util.Calendar。请参阅此答案以了解操作方法。


4
您可以用来cal.add(Calendar.DAY_OF_MONTH, -48)对Calendar对象进行日算术。并且您可以使用比较两个Calendar对象cal.compareTo(anotherCal)
Florent Guillaume

1
辉煌,弗洛伦特欢呼!以上是否表示使用日历get方法时,日历会返回更新的年,日,秒,分钟和秒?Dave
daveb '02

11
请注意,月份以0开头而不是1(即一月= 0)。docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
Steve Kuo

10
为什么JAVA如此不便?
泡菜人2014年

3
由于日期和日历过旧且设计错误。Java 8具有更好的数据/时间对象,请参见oracle.com/technetwork/articles/java/…–
Florent Guillaume

88

使用Java 8和更高版本,您可以将Date对象转换为LocalDate对象,然后轻松获取年,月和日。

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int year  = localDate.getYear();
int month = localDate.getMonthValue();
int day   = localDate.getDayOfMonth();

请注意,getMonthValue()返回从1到12的int值。


10
现在是2016年,我相信使用LocalDateJava中8的是,另一种解决方案采用节省您的时间的最佳解决方案Calendar,并Date充满了烦恼。
AnnieFromTaiwan

2
很好的答案-绝对最好使用java.time并避免麻烦的旧日期时间类。另外,请注意此答案是如何明智地解决时区问题的。在任何给定时刻,日期都会随时区在全球范围内变化。
罗勒·布尔克

1
不幸的是,Android的API级别为26+。
Wiktor Kalinowski

14

您可以执行类似的操作,它将说明Date该类的工作原理。

String currentDateString = "02/27/2012 17:00:00";
SimpleDateFormat sd = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date currentDate = sd.parse(currentDateString);

String yourDateString = "02/28/2012 15:00:00";
SimpleDateFormat yourDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

Date yourDate = yourDateFormat.parse(yourDateString);

if (yourDate.after(currentDate)) {
    System.out.println("After");
} else if(yourDate.equals(currentDate)) {
    System.out.println("Same");
} else {
    System.out.println("Before");
}

嗨,JavaCity,谢谢。这非常有用。目前,我正试图避免从日期字符串中进行解析。但是,当我让应用程序的用户设置年,日和月时,我将需要稍后进行此解析。我打算建立一个字符串以解析为SimpleDateFormat。上面的内容对于实际操作非常有用。我的Java日期是从其实例化前的日期和时间创建的。我现在希望与今天实例化的gregoriancalendar日期进行比较。真诚的感谢
daveb 2012年

8
请修复代码。小写mm表示分钟,大写MM表示一年中的月份。
2016年

12
    Date date = new Date();

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");

    System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("MMMM");
    System.out.println("MONTH "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("YYYY");
    System.out.println("YEAR "+simpleDateFormat.format(date).toUpperCase());

编辑:date= 的输出Fri Jun 15 09:20:21 CEST 2018是:

DAY FRIDAY
MONTH JUNE
YEAR 2018

如果至少放置了输出,则人们可以决定是否对他们有用,而不必运行代码。
SantiBailors

6
private boolean isSameDay(Date date1, Date date2) {
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date1);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(date2);
    boolean sameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);
    boolean sameMonth = calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH);
    boolean sameDay = calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
    return (sameDay && sameMonth && sameYear);
}

3
    Date queueDate = new SimpleDateFormat("yyyy-MM-dd").parse(inputDtStr);
    Calendar queueDateCal = Calendar.getInstance();
    queueDateCal.setTime(queueDate);
    if(queueDateCal.get(Calendar.DAY_OF_YEAR)==Calendar.getInstance().get(Calendar.DAY_OF_YEAR))
{
    "same day of the year!";
 }

1
关于堆栈溢出的答案应该进行一些讨论和解释,而不仅仅是代码片段。而且您的代码肯定可以使用一些解释。
罗勒·布尔克

1
仅供参考,非常麻烦旧日期,时间类,如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat现在的遗产,由取代java.time内置到Java 8和更高等级。请参见Oracle 教程
罗勒·布尔克

2
@Test
public void testDate() throws ParseException {
    long start = System.currentTimeMillis();
    long round = 100000l;
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay(new Date());
    }
    long mid = System.currentTimeMillis();
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay2(new Date());
    }
    long end = System.currentTimeMillis();
    System.out.println(mid - start);
    System.out.println(end - mid);
}

public static Date getYearMonthDay(Date date) throws ParseException {
    SimpleDateFormat f = new SimpleDateFormat("yyyyyMMdd");
    String dateStr = f.format(date);
    return f.parse(dateStr);
}

public static Date getYearMonthDay2(Date date) throws ParseException {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.SECOND, 0);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.HOUR_OF_DAY, 0);
    return c.getTime();
}
public static int compare(Date today, Date future, Date past) {
    Date today1 = StringUtil.getYearMonthDay2(today);
    Date future1 = StringUtil.getYearMonthDay2(future);
    Date past1 = StringUtil.getYearMonthDay2(past);
    return today.compare // or today.after or today.before
}

getYearMonthDay2(日历解决方案)快十倍。现在您有了yyyy MM dd 00 00 00,然后使用date.compare进行比较


2

可能会更容易

     Date date1 = new Date("31-May-2017");
OR
    java.sql.Date date1 = new java.sql.Date((new Date()).getTime());

    SimpleDateFormat formatNowDay = new SimpleDateFormat("dd");
    SimpleDateFormat formatNowMonth = new SimpleDateFormat("MM");
    SimpleDateFormat formatNowYear = new SimpleDateFormat("YYYY");

    String currentDay = formatNowDay.format(date1);
    String currentMonth = formatNowMonth.format(date1);
    String currentYear = formatNowYear.format(date1);

-2

小心地从0而不是1开始安装。日历也像am一样使用pm,以便在使用Hours和minutes时非常小心。

Date your_date;
Calendar cal = Calendar.getInstance(); 
cal.setTime(your_date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MINUTE);


1
最好使用现代的java.time代替这里显示的这些麻烦的旧旧类。看到正确的答案
Basil Bourque

感谢您的回答和建议。很好。
harun ugur
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.