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

Posted

技术标签:

【中文标题】我想从 Java 日期中获取年、月、日等,以与 Java 中的公历日期进行比较。这可能吗?【英文标题】:I want to get Year, Month, Day, etc from Java Date to compare with Gregorian Calendar date in Java. Is this possible? 【发布时间】:2012-03-17 11:07:05 【问题描述】:

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

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

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

我看到目前 Java 日期以 long 形式存储,唯一可用的方法似乎只是将 long 写入格式化的日期字符串。有没有办法访问年、月、日等?

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

我的最终目标是进行日期计算,以便我可以检查 Java 日期是否在今天的日期和时间的这么多小时、分钟等范围内。

我还是 Java 新手,对此感到有些困惑。

【问题讨论】:

嘿,无论你使用什么,都不要使用Date.getYear()。它有问题(我不知道)。Date.getYear() 曾经解析我的日期 30/06/2017,它返回了我的年份如 117。看看它降落的地方,两千年前。但是当我只打印日期对象时,输出很好。但不是Date.getYear(); 仅供参考:您正在使用麻烦的旧日期时间类,这些类现在是遗留的,被现代 java.time 类所取代。 【参考方案1】:

使用类似的东西:

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。请参阅this answer 了解如何操作。

【讨论】:

您可以使用cal.add(Calendar.DAY_OF_MONTH, -48) 对日历对象进行日运算。您可以使用cal.compareTo(anotherCal) 比较两个日历对象。 太棒了,弗洛伦特欢呼!以上是否意味着当使用日历获取方法时,日历将返回更新的年日、秒、分和秒?戴夫 请注意,月份以 0 而不是 1 开头(即 January=0)。 docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH 为什么JAVA这么不方便? 因为日期和日历已经过时且设计不佳。 Java 8 有更好的数据/时间对象,见oracle.com/technetwork/articles/java/…【参考方案2】:

使用 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 值。

【讨论】:

现在是 2016 年,我相信在 Java 8 中使用 LocalDate 是节省时间的最佳解决方案,而使用 CalendarDate 的另一种解决方案则很麻烦。 很好的答案 - 绝对最好使用 java.time 并避免麻烦的旧日期时间类。另外,请注意此答案如何明智地解决时区问题。对于任何给定的时刻,日期在全球范围内都会因时区而异。 不幸的是,android 的 API 级别 26+。 现在是2021年,这绝对是最好的答案!【参考方案3】:
    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

【讨论】:

如果您至少提供了输出,人们可以决定这是否对他们有用,而无需运行代码。 注意格式模式字母的大小写。大写YYYY 不正确。而且我们不应该再使用SimpleDateFormat,它是一个臭名昭著的班级麻烦制造者。【参考方案4】:

你可以这样做,它将解释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 日期进行比较。真诚的感谢 请修正代码...小写mm表示分钟,大写MM表示月份。【参考方案5】:
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);

【讨论】:

【参考方案6】:

这可能更容易

     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);

【讨论】:

【参考方案7】:
    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!";
 

【讨论】:

关于 Stack Overflow 的答案预计会有一些讨论和解释,而不仅仅是代码 sn-ps。而且您的代码肯定可以使用一些解释。 仅供参考,非常麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle。【参考方案8】:
@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 进行比较

【讨论】:

以上是关于我想从 Java 日期中获取年、月、日等,以与 Java 中的公历日期进行比较。这可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Joda-Time 获取给定日期和时区的 UTC 偏移量

标准化 SQL 表中的列

两个日期之间的特定天数

从 C++ 中的 std::chrono::time_point 中提取年/月/日等

蜂巢获取每个月的结束日期

如何快速获取一个月的对象