了解java中的最近30天,60天和90天

时间:2009-06-11 05:29:49

标签: java date

如何从java中的给定日期获取最后30/60/90天的记录?

我在receivedDate上有一些记录。我想从收到的日期获取最近30或60或90天的记录。如何解决?

8 个答案:

答案 0 :(得分:42)

使用java.util.Calendar

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)

TL;博士

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.time

现代方法使用Java 8及更高版本中内置的 java.time 类,并反向移植到Java 6& 7。

LocalDate

LocalDate类代表没有时间且没有time zoneoffset-from-UTC的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

如果未指定时区,则JVM会隐式应用其当前的默认时区。在运行时(!)期间,该默认值可能为change at any moment,因此您的结果可能会有所不同。最好明确指定您期望/预期的时区作为参数。如果关键,请与您的用户确认该区域。

Continent/Region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用2-4字母缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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::plusLocalDate::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

听起来像是在查询数据库。从JDBC 4.2及更高版本开始,您可以与数据库交换 java.time 对象。对于类似于SQL标准标准DATE的数据类型的数据库列(仅限日期值,没有时间和没有时区),请在Java中使用LocalDate类。 / p>

myPreparedStatement.setObject( … , ago_30 ) ;

检索:

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore


约达-时间

更新: 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);

}

我在某处找到了此解决方案,并根据需要对其进行了修改