首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在java.util.Date中获取当前季度的第一个日期和最后一个日期

如何在java.util.Date中获取当前季度的第一个日期和最后一个日期
EN

Stack Overflow用户
提问于 2016-04-08 07:12:12
回答 8查看 35.6K关注 0票数 14

我需要将当前季度的第一个日期作为java.util.Date对象,将当前季度的最后一个日期作为java.util.Date对象。

我正在使用以下方法来获得这个月的第一次约会和这个月的最后一次约会。

代码语言:javascript
运行
复制
private   Date getThisMonthFirstDate(){
    Calendar calendar = new GregorianCalendar();
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    calendar.set(Calendar.DAY_OF_MONTH, 1);
    return calendar.getTime();
}

private   Date getThisMonthLastDate(){
    Calendar calandar = new GregorianCalendar();
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    calendar.set(Calendar.DAY_OF_MONTH,1);
    calendar.add(Calendar.MONTH, 1);
    calendar.add(Calendar.DATE, -1);
   return calendar.getTime();
}

是否有办法修改这个功能来实现这一点,或者有人能指出一个更好的方法吗?

假设Q1 =一月二月三月,Q2 =四月,五月,六月等。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2016-04-08 07:54:47

以下是Java 7或更高版本的解决方案(否则,我建议检查其他答案):

代码语言:javascript
运行
复制
private static Date getFirstDayOfQuarter(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.DAY_OF_MONTH, 1);
    cal.set(Calendar.MONTH, cal.get(Calendar.MONTH)/3 * 3);
    return cal.getTime();
}

private static Date getLastDayOfQuarter(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.DAY_OF_MONTH, 1);
    cal.set(Calendar.MONTH, cal.get(Calendar.MONTH)/3 * 3 + 2);
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
    return cal.getTime();
}

注1:月在java.util.Calendar中表示为从0(1月)到11 (12月)的整数

注释2: Java中整数的除法会产生地板值(另一个整数值)。2/3 = 0,4/3 =1,以此类推。因此,cal.get(Calendar.MONTH)/3 * 3计算的零基指数为: 0(Q1),1(Q2),2(Q3),3(Q4).

例句:日历中的2月为1.so,1/3*3= 0。

如果提供2月日期,则季度开始日期为1月1日(因为我们得到0),季度末为0+2=2 (Mar)。

票数 17
EN

Stack Overflow用户

发布于 2018-06-05 14:42:29

纯Java-8+解决方案:

代码语言:javascript
运行
复制
LocalDate localDate = LocalDate.now();
LocalDate firstDayOfQuarter = localDate.with(localDate.getMonth().firstMonthOfQuarter())
    .with(TemporalAdjusters.firstDayOfMonth());

LocalDate lastDayOfQuarter = firstDayOfQuarter.plusMonths(2)
    .with(TemporalAdjusters.lastDayOfMonth());
票数 43
EN

Stack Overflow用户

发布于 2016-04-08 19:05:48

正如其他人提到的,您正在使用过时的类。Sun/Oracle决定用java.time框架取代旧的日期时间类,这是一个巨大的改进。

避免使用旧的日期-时间类。它们确实设计得很糟糕,令人困惑,也很麻烦。

java.time

java.time框架内置在Java8中,对于Java6& 7,使用后台端口三次-支持。对于Android来说,它是对后端端口ThreeTenABP的改造。

java.time框架的灵感来源于由JSR 310定义的高度成功的Joda-Time库,并由ThreeTen额外项目扩展。见Oracle教程

LocalDate

对于只有日期的值,没有一天的时间,也没有时区,使用LocalDate内置作为java.time的一部分。要获得当前的日期,需要一个时区,因为日期在世界各地都有变化(东方新的一天会提前到来)。

代码语言:javascript
运行
复制
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );

Quarter & YearQuarter

上面提到的三次-额外项目是将来可能添加到java.time中的特性的试验场。要使用这个库,请将其jar文件添加到您的项目中(或使用Maven等)。如果您真的不想添加库,请参阅备选解决方案dheeran回答

这个库目前包括您可能认为特别有用的QuarterYearQuarter类。在代码中传递这些类型的对象比使用字符串和数字来表示季度更安全。

代码语言:javascript
运行
复制
YearQuarter currentQuarter = YearQuarter.now ( zoneId );

YearQuarter有许多有用的方法,包括询问日期。

代码语言:javascript
运行
复制
LocalDate start = currentQuarter.atDay ( 1 );
LocalDate stop = currentQuarter.atEndOfQuarter ();

转储到控制台。

代码语言:javascript
运行
复制
System.out.println ( "today: " + today + " currentQuarter: " + currentQuarter + " start: " + start + " stop: " + stop );

今日: 2016-04-08 currentQuarter: 2016-Q2开始: 2016-04-01停: 2016-06-30

如果您真的不想像我建议的那样添加ThreeTen额外的库,请参阅帕维尔的回答以获得另一种解决方案,只使用内置的java.time类。但是,如果你做了大量的工作,我相信你会发现三倍-额外的是值得的麻烦,增加一个库到您的项目。

转换

如果必须使用java.util.Date来处理尚未更新为java.time的旧代码,则可以来回转换。查找添加到旧类中的新方法以进行转换。

不幸的是,旧类缺乏任何表示日期唯一值的干净方法。因此,没有完全干净的方式可以到达/离开LocalDate

java.sql.Date

java.sql.Date类假装是仅限日期的,但实际上包含一个经过00:00:00.0调整的时间。这个类笨拙地继承自java.util.Date,但文档显然警告不要使用这个事实;您应该将这两个类视为独立的无关类。

代码语言:javascript
运行
复制
java.sql.Date sqlDate_quarterStart = java.sql.Date.valueOf( start );

java.util.Date

java.util.Date既代表一天的日期,又代表一天的时间,在世界协调时是有效的.我们可以首先将LocalDate调整为一天中的第一分钟,以得到一天中有时间的日期,即ZonedDateTime。从那里,我们可以要求一个Instant,这是时间线上的一个时刻,在世界协调时。旧的.Date类有一个静态from( Instant )转换方法。

代码语言:javascript
运行
复制
ZonedDateTime zdt = start.atStartOfDay( zoneId ); // First moment of the day on a certain date.
Instant instant = zdt.toInstant(); // Moment on the timeline in UTC.
java.util.Date utilDate = java.util.Date.from( instant );

关于java.time

http://docs.oracle.com/javase/10/docs/api/java/time/package-summary.html框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.DateCalendarSimpleDateFormat

http://www.joda.org/joda-time/项目现在在维护模式中,建议迁移到java.time类。

要了解更多信息,请参见http://docs.oracle.com/javase/tutorial/datetime/TOC.html。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310

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

在哪里获得java.time类?

  • Java 8Java 9Java 10,以及后来的
    • 内置的。
    • 带有捆绑实现的标准Java的一部分。
    • Java 9添加了一些次要的特性和修复。

  • Java 6Java 7
    • java.time的大部分功能都是在http://www.threeten.org/threetenbp/中移植到Java6&7中的。

三次-额外项目使用其他类扩展java.time。这个项目是将来可能加入java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter更多

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36493649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档