Java中如何确定日期的大小

3

我有时间戳,格式为字符串 Sun Jul 10 17:47:55 EDT 2011

我需要确定当前的日期是否大于存储的日期。

我将使用以下代码获取当前日期:Date currentDate = new Date();

我将使用 SimpleDateFormat dateParser = new SimpleDateParser("E MMM d HH:mm:ss z y"); 将我的字符串解析为一个 Date 对象。

但是使用 "currentDate.after()" 函数或 currentDate.compare() 函数只会告诉我任何日期是否大于或小于,包括小时、分钟或秒。

所以我的下一个想法是将日期转换为一年中的天数,并比较新的整数。如果 integer1 > integer2,则...... 但我该如何做呢?

我还考虑将字符串分割为子字符串,仅由存储的字符串日期的前半部分组成。 Sun Jul 10Sun Jul 10 ,但问题在于日期值有时为 1 位数字,有时为 2 位数字。

此外,我认为 Calendar 抽象类是最好的方法,但我不确定,目前对如何将 Date 对象转换为 Calendar 对象进行比较感到困惑!

期待您的帮助。


2
可能是重复的问题:如何比较两个不带时间部分的日期? - Don Roby
5个回答

3
这可能有助于您的情况(作为快速方法):
Locale.setDefault(Locale.UK);
String storedDateString = "Sun Jul 10 17:47:55 EDT 2011";
SimpleDateFormat dateParser = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy");

Date storedDate = dateParser.parse(storedDateString);

GregorianCalendar storedCal = new GregorianCalendar();
storedCal.setTime(storedDate);
GregorianCalendar currentCal = new GregorianCalendar();

int storedDayOfYear = storedCal.get(Calendar.DAY_OF_YEAR);
int currentDayofYear = currentCal.get(Calendar.DAY_OF_YEAR);

//int storedDayYear = storedCal.get(Calendar.YEAR);
//int currentDayYear = storedCal.get(Calendar.YEAR);

System.out.println(storedDayOfYear);
System.out.println(currentDayofYear);

//System.out.println(storedDayYear);
//System.out.println(currentDayYear);

结果:

191
192

之后,比较int值就很容易了。


我本来想用DateFormat的DAY_OF_YEAR_FIELD,但你的看起来也不错。 - Scott C Wilson

1
如果你想将一个日期对象转换成日历对象,请使用以下代码:

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(new Date());

您可以使用以下代码获取 Calendar 对象的日期值:
    cal.get(Calendar.DAY_OF_MONTH);

或者

    calendar.get(Calendar.DAY_OF_YEAR);

然而,需要注意的是,比较不同月份(第一个例子)或年份(第二个例子)的日期时这种方法不可行。你应该把每个日历对象的毫秒、秒、分钟和小时设置为0,再比较这些对象:

    Calendar c1 = Calendar.getInstance();
    Calendar c2 = Calendar.getInstance();
    c1.setTime(date1);
    c2.setTime(date2);

    c1.set(Calendar.MILLISECOND, 0);
    c1.set(Calendar.SECOND, 0);
    c1.set(Calendar.MINUTE, 0);
    c1.set(Calendar.HOUR, 0);

    c2.set(Calendar.MILLISECOND, 0);
    c2.set(Calendar.SECOND, 0);
    c2.set(Calendar.MINUTE, 0);
    c2.set(Calendar.HOUR, 0);

    c1.compareTo(c2);

0

简而言之

ZonedDateTime.parse( 
    "Sun Jul 10 17:47:55 EDT 2011" , 
    DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US ) 
).getDayOfYear()

一年中的第几天

显然你想比较两个日期在一年中是哪一天,不考虑年份和具体时间。

这种一年中第几天的概念通常被错误地标记为儒略日(Julian dates),但它正确地被称为序数日期。即使包括年份,如2017-186。但显然你只想得到一年中的具体天数,一个从1到365或366的数字。

使用java.time

现代方法是使用取代你所使用的老旧日期时间类的java.time类。

首先将你的字符串解析为ZonedDateTime

String input = "Sun Jul 10 17:47:55 EDT 2011" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US ) ;
ZonedDateTime zdt = ZonedDateTime.parse( input , f ) ;

zdt.toString(): 2011-07-10T17:47:55-04:00[America/New_York]
顺便说一下,永远不要使用3-4个字母的缩写,比如EST或IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的!请以continent/region的格式指定正确的时区名称,例如America/MontrealAfrica/CasablancaPacific/Auckland
最后,获取您所需的一年中的日期整数。
int dayOfYear = zdt.getDayOfYear() ;

日子序号:191
查看此代码在IdeOne.com上的实时运行

0
Calendar cal = Calendar.getInstance();  // use the getInstance(TimeZone zone) overload
                                        // if you want some other timezone than the
                                        // default one
cal.setTime(yourDate);
cal.get(Calendar.DAY_OF_MONTH);

0
首先,使用toString()将Date对象转换为String。完成后,使用split(" ")拆分字符串。这将返回一个String[]。由于两种格式相同,因此在两个数组中,第三个元素将包含日期第二个元素将是月份
如果月份相同,则只需查看哪个日期比另一个日期大(也可以检查年份)。

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