Java Date确定DAY是否更大

时间:2011-07-10 22:13:57

标签: java date calendar simpledateformat

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

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

我将获得当天 Date currentDate = new Date();

我将使用Date

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

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

所以我的下一个预感是将日期转换为一年中的日期,并比较新的整数,如果integer1> gt;整数2,那么..但我该怎么做?

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

另外我认为Calendar抽象类是解决这个问题的最佳方法,但我不确定,并且目前在如何将Date对象转换为Calendar对象以进行比较时出现迷雾!

洞察力赞赏

5 个答案:

答案 0 :(得分: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值是微不足道的。

答案 1 :(得分:1)

如果要将Date对象转换为Calendar对象,请使用

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

您可以使用

获取Calendar对象的日期值
    cal.get(Calendar.DAY_OF_MONTH);

    calendar.get(Calendar.DAY_OF_YEAR);

然而,请注意,在比较不同月份(第一个示例)或年份(第二个示例)的日期时,这不起作用。您最好在每个Calendar对象上将毫秒,秒,分钟和小时设置为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);

答案 2 :(得分: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);

答案 3 :(得分:0)

首先,使用toString()将Date对象转换为String。完成此操作后,使用split(" ")拆分字符串。这将返回String[]。由于两种格式都相同,因此在两个数组中都是third element will contain the datesecond element will be month

如果月份相同,那么您只需要查看哪个日期比另一个日期大(您还可以查看年份)。

答案 4 :(得分:0)

TL;博士

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

191

日间的年

显然,您想比较两个日期的日期,每个日期的年份,无论年份如何,也不管日期时间。

这一天的想法常常被错误标记为朱利安日期,但恰如其分地称为Ordinal Date。甚至包括一年,例如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]

顺便说一句,永远不要使用ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。以continent/region格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland

最后,获取您寻找的日期整数。

int dayOfYear = zdt.getDayOfYear() ;
  

dayOfYear:191

请参阅this code run live at IdeOne.com