如何从java中的给定日期获取最后30/60/90天的记录?
我在receivedDate上有一些记录。我想从收到的日期获取最近30或60或90天的记录。如何解决?
答案 0 :(得分:42)
Date today = new Date();
Calendar cal = new GregorianCalendar();
cal.setTime(today);
cal.add(Calendar.DAY_OF_MONTH, -30);
Date today30 = cal.getTime();
cal.add(Calendar.DAY_OF_MONTH, -60);
Date today60 = cal.getTime();
cal.add(Calendar.DAY_OF_MONTH, -90);
Date today90 = cal.getTime();
答案 1 :(得分:9)
LocalDate // Represent a date-only value, without time-of-day and without time zone.
.now( // Capture today's date as seen in the wall-clock time used by the people of a particular region (a time zone).
ZoneId.of( "Asia/Tokyo" ) // Specify the desired/expected zone.
) // Returns a `LocalDate` object.
.minus( // Subtract a span-of-time.
Period.ofDays( 30 ) // Represent a span-of-time unattached to the timeline in terms of years-months-days.
) // Returns another `LocalDate` object.
捆绑的java.util.Date& .Calendar组的课程非常麻烦。避免它们。
现代方法使用Java 8及更高版本中内置的 java.time 类,并反向移植到Java 6& 7。
LocalDate
LocalDate
类代表没有时间且没有time zone或offset-from-UTC的仅限日期的值。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
如果未指定时区,则JVM会隐式应用其当前的默认时区。在运行时(!)期间,该默认值可能为change at any moment,因此您的结果可能会有所不同。最好明确指定您期望/预期的时区作为参数。如果关键,请与您的用户确认该区域。
以Continent/Region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用2-4字母缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
如果要使用JVM的当前默认时区,请求它并作为参数传递。如果省略,代码变得模糊不清,因为我们不确定您是否打算使用默认值,或者您是否像许多程序员一样,不知道这个问题。
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
或指定日期。您可以将月份设置为一个数字,1月至12月的数字为1-12。
LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ; // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
或者,更好的是,使用预定义的Month
枚举对象,一年中的每个月一个。提示:在整个代码库中使用这些Month
对象而不仅仅是整数,以使代码更具自我记录功能,确保有效值并提供type-safety。同上Year
& YearMonth
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
您可以使用Period
课程定义以年 - 月 - 天为单位的时间跨度。
Period days_30 = Period.ofDays( 30 ) ;
Period days_60 = Period.ofDays( 60 ) ;
Period days_90 = Period.ofDays( 90 ) ;
您可以在Period
之间添加和减去LocalDate
,从而生成另一个LocalDate
对象。调用LocalDate::plus
或LocalDate::minus
方法。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( z ) ;
LocalDate ago_30 = today.minus( days_30 ) ;
LocalDate ago_60 = today.minus( days_60 ) ;
LocalDate ago_90 = today.minus( days_90 ) ;
你更直接地调用LocalDate.minusDays
,但我怀疑命名的Period
对象会使你的代码更具可读性和自我记录。
LocalDate ago = today.minusDays( 30 ) ;
听起来像是在查询数据库。从JDBC 4.2及更高版本开始,您可以与数据库交换 java.time 对象。对于类似于SQL标准标准DATE
的数据类型的数据库列(仅限日期值,没有时间和没有时区),请在Java中使用LocalDate
类。 / p>
myPreparedStatement.setObject( … , ago_30 ) ;
检索:
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
更新: Joda-Time库现在处于维护模式。它的创建者Stephen Colebourne继续根据Joda-Time的经验教训领导JSR 310和 java.time 实现。我将此部分保留为历史记录,但建议使用 java.time 。
以下是使用Joda-Time 2.3库的LocalDate类的示例代码。
LocalDate now = LocalDate.now();
LocalDate thirty = now.minusDays( 30 );
LocalDate sixty = now.minusDays( 60 );
LocalDate ninety = now.minusDays( 90 );
转储到控制台...
System.out.println( "now: " + now );
System.out.println( "thirty: " + thirty );
System.out.println( "sixty: " + sixty );
System.out.println( "ninety: " + ninety );
跑步时......
now: 2014-03-26
thirty: 2014-02-24
sixty: 2014-01-25
ninety: 2013-12-26
一天的开始和结束取决于您的时区。巴黎新的一天早于蒙特利尔。
默认情况下,LocalDate类使用JVM的默认时区来确定当前日期。或者,您可以传递DateTimeZone对象。
LocalDate localDate = new LocalDate( DateTimeZone.forID( "Europe/Paris" ) );
答案 2 :(得分:2)
如果您在 xdaysago 中输入 1 表示 1 天前 30 表示 30 天前,您可以在 ZoneId 类中查看您的区域 ID。
public static String getDate(int xdaysago){
LocalDate localDate = LocalDate.now(ZoneId.of( "Asia/Karachi" )).minus( Period.ofDays( xdaysago ));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
return localDate.format(formatter);
}
答案 3 :(得分:1)
不确定从哪里获取数据,但是为了计算日期,比如说30天之后你可以使用Calendar类的添加函数,如下所示:
c.add(Calendar.DAY_OF_MONTH,-30); //假设c的类型为java.util.Calendar
现在要弄清楚特定日期是在今天和30天之间,您可以使用before()和after()函数来确定日期是在今天之前,还是在今天之前的第30天之后。
答案 4 :(得分:1)
老实说,我建议您使用Joda作为日期和时间库。它不仅具有优越的API,而且它理解(即具有类)等概念,如句点,持续时间和类似的东西。
答案 5 :(得分:1)
使用日历,我需要从当前日期开始减去N天。最好的方法是:
public Date getDateVariation(Integer variation, Date currentDate) {
Calendar c = Calendar.getInstance();
c.setTime(currentDate);
c.add(Calendar.DAY_OF_YEAR, - (variation));
return c.getTime();
}
变化是我希望10/30/60/120天的N天。
答案 6 :(得分:1)
private static Date daysAgo(int days) {
GregorianCalendar gc = new GregorianCalendar();
gc.add(Calendar.DATE, -days);
return gc.getTime();
}
答案 7 :(得分:0)
获取未来日期的代码
public String futureDateByFourMonths() {
Date currentDate = new Date();
Calendar c = Calendar.getInstance();
c.setTime(currentDate);
c.add(Calendar.MONTH, 4);
c.add(Calendar.DATE, 1);
c.add(Calendar.HOUR, 1);
c.add(Calendar.MINUTE, 1);
c.add(Calendar.SECOND, 1);
Date currentDatePlusOne = c.getTime();
return dateFormat.format(currentDatePlusOne);
}
只需更改月份,然后减去月份数
public String pastDateByFourMonths() {
Date currentDate = new Date();
Calendar c = Calendar.getInstance();
c.setTime(currentDate);
c.add(Calendar.MONTH, -4);
c.add(Calendar.DATE, -1);
c.add(Calendar.HOUR, 1);
c.add(Calendar.MINUTE, 1);
c.add(Calendar.SECOND, 1);
Date currentDatePlusOne = c.getTime();
return dateFormat.format(currentDatePlusOne);
}
我在某处找到了此解决方案,并根据需要对其进行了修改