通过传递java中的开始和结束日期来获取给定日期的周数

通过传递java中的开始和结束日期来获取给定日期的周数,java,datetime,Java,Datetime,我试图得到给定日期的周数,它介于开始日期和结束日期之间。 下面是我曾经得到的代码,但它只能工作4周 我需要它让它工作几周 public static int getWeekNO( Timestamp startTime,Timestamp endTime , Timestamp dateTime) throws RuntimeException { String formatted = null; Timestamp currentTimestamp;

我试图得到给定日期的周数,它介于开始日期和结束日期之间。 下面是我曾经得到的代码,但它只能工作4周

我需要它让它工作几周

public static int getWeekNO( Timestamp startTime,Timestamp endTime , Timestamp dateTime) throws RuntimeException {

        String formatted = null;
        Timestamp currentTimestamp;
        int weekNumber = 0;

        logger.debug("startTime"+startTime);
        logger.debug("endTime"+endTime);
        logger.debug("dateTime"+dateTime);
        try {
            String formatDateFirst =  "";
            String formatDateSecond = "";
            String formatDateThird = "";
            String formatDateFourth = "";
            String givenDateString = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(dateTime);
            String startDateString = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startTime);
            String endDateString = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(endTime);
            logger.debug("givenDateString"+givenDateString);
            logger.debug("startDateString"+startDateString);
            logger.debug("endDateString"+endDateString);


            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

            Calendar c = Calendar.getInstance();
            Date givenDate = sdf.parse(givenDateString);
            Date startDate = sdf.parse(startDateString);
            Date endDate = sdf.parse(endDateString);

            logger.debug("givenDate"+givenDate);
            logger.debug("startDate"+startDate);
            logger.debug("endDate"+endDate);

            c.setTime(sdf.parse(startDateString));

            c.add(Calendar.DAY_OF_MONTH, 6); // number of days to add
            formatDateFirst = sdf.format(c.getTime());
            Date firstWeekDate = (Date) sdf.parse(formatDateFirst);
            logger.debug("endDate"+firstWeekDate);

            c.add(Calendar.DAY_OF_MONTH, 7); // number of days to add
            formatDateSecond = sdf.format(c.getTime());
            Date secondWeekDate = (Date) sdf.parse(formatDateSecond);
            logger.debug("endDate"+secondWeekDate);

            c.add(Calendar.DAY_OF_MONTH, 7); // number of days to add
            formatDateThird = sdf.format(c.getTime());
            Date thirdWeekDate = (Date) sdf.parse(formatDateThird);
            logger.debug("endDate"+thirdWeekDate);

            c.add(Calendar.DAY_OF_MONTH, 7); // number of days to add
            formatDateFourth = sdf.format(c.getTime());
            Date fourthWeekDate = (Date) sdf.parse(formatDateFourth);
            logger.debug("endDate"+fourthWeekDate);


            if (givenDate.compareTo(firstWeekDate) <= 0) {
                weekNumber = 1;
            } else if (givenDate.compareTo(secondWeekDate) <= 0
                    && givenDate.compareTo(firstWeekDate) > 0) {
                weekNumber = 2;
                } else if (givenDate.compareTo(thirdWeekDate) <= 0
                    && givenDate.compareTo(secondWeekDate) > 0) {
                    weekNumber = 3;
            }else if (givenDate.compareTo(fourthWeekDate) <= 0
                    && givenDate.compareTo(thirdWeekDate) > 0) {
                    weekNumber = 4;
            }else{
                logger.debug("Not a Valid Date");
            }

        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
        return weekNumber;
    } 
这里我使用的是Java1.7,因此无法使用--import java.time.LocalDateTime; 导入java.time.temporal.ChronoUnit

我怎样才能做到这一点,请在这方面帮助我

    public static int getWeekNO(Timestamp startTime, Timestamp endTime, Timestamp dateTime) {
      if (dateTime.compareTo(startTime) < 0 || dateTime.compareTo(endTime) > 0) {
        System.out.println("Not a Valid Date");
        return -1;
      }
      return (int) ((dateTime.getTime() - startTime.getTime() - 1) / (1000L * 3600 * 24 * 7)) + 1;
    }
此构造函数的月份以0开头。因此,上述代码将2016-4-30与2016-5-6进行比较。才一个星期

此构造函数的月份以0开头。因此,上述代码将2016-4-30与2016-5-6进行比较。只有一周。

使用java.time 不要对业务逻辑使用
java.sql.Timestamp
。该类仅用于与数据库交换数据。甚至这个目的现在也被java.time类所取代。对于Java 7,使用下面项目符号中列出的Java.time的后端口

现在,诸如、和
java.text.SimpleTextFormat
等麻烦的旧日期时间类已被这些类所取代

DayOfWeek

指定一周中你认为是一周的开始的一天。使用

DayOfWeek
enum对象。顺便说一下,标准定义从周一开始

DayOfWeek dowStart = DayOfWeek.MONDAY ;
LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

指定开始/停止日期

LocalDate start = LocalDate.parse( 2016 , 4 , 9 ) ; 
LocalDate stop = LocalDate.parse( 2016 , 6 , 28 ) ;
LocalDate first = start.with( TemporalAdjusters.previousOrSame( dowStart ) ) ;

List<LocalDate> dates = new ArrayList<>() ;
LocalDate ld = first ; // Initialize for loop.
while( ld.isBefore( stop ) ) {  // While the local date is before the stopping point.
    dates.add( ld ) ;
    // Prepare for next loop.
    ld = ld.plusWeeks( 1 ) ;
}

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如,和。

使用java.time 不要对业务逻辑使用
java.sql.Timestamp
。该类仅用于与数据库交换数据。甚至这个目的现在也被java.time类所取代。对于Java 7,使用下面项目符号中列出的Java.time的后端口

现在,诸如、和
java.text.SimpleTextFormat
等麻烦的旧日期时间类已被这些类所取代

DayOfWeek

指定一周中你认为是一周的开始的一天。使用

DayOfWeek
enum对象。顺便说一下,标准定义从周一开始

DayOfWeek dowStart = DayOfWeek.MONDAY ;
LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

指定开始/停止日期

LocalDate start = LocalDate.parse( 2016 , 4 , 9 ) ; 
LocalDate stop = LocalDate.parse( 2016 , 6 , 28 ) ;
LocalDate first = start.with( TemporalAdjusters.previousOrSame( dowStart ) ) ;

List<LocalDate> dates = new ArrayList<>() ;
LocalDate ld = first ; // Initialize for loop.
while( ld.isBefore( stop ) ) {  // While the local date is before the stopping point.
    dates.add( ld ) ;
    // Prepare for next loop.
    ld = ld.plusWeeks( 1 ) ;
}

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。

Use.@Elliott Frisch Joda time出现在Java SE 8中,我正在开发Java SE 7project@dafodil不,是第三方库,不是Java的一部分。我猜想您正在考虑哪个是内置在Java8和更高版本中的,它取代了旧的日期时间类,并受到了Joda time的启发。Joda Time团队建议用户迁移到java.Time。java.time的大部分功能都是后移植的,并在中进一步适应了Android。@Basil Bourque您的评论提供了信息,谢谢。但我不应该使用任何第三方库,因为我正在处理bulit项目,它应该由现有的库和api来维护。@dafodil您是在问:给定的时间间隔吗(一对日期时间值),间隔开始后的几周是特定的日期时间值(第三个单独的日期时间值)?使用。@Elliott Frisch Joda time出现在Java SE 8中,我正在开发Java SE 7project@dafodil不,它是一个第三方库,不是Java的一部分。我怀疑您正在考虑将它内置到Java 8和更高版本中,取代旧的日期时间类,并受到Joda time的启发。Joda time团队建议用户迁移到Java.time.Much的java.time功能被移植到中,并进一步适应于中的Android。@Basil Bourque您的评论提供了信息,谢谢。但我不应该使用任何第三方库,因为我正在处理已经存在的bulit项目,它应该由现有的库和api来维护。@dafodil您是在问:给定的时间间隔吗(一对日期时间值),间隔开始后的几周是特定的日期时间值(第三个单独的日期时间值)?如果要忽略“HH:mm:ss”,只需将三个输入的三个值重置为零。它不包括在
LocalDate start = LocalDate.parse( 2016 , 4 , 9 ) ; 
LocalDate stop = LocalDate.parse( 2016 , 6 , 28 ) ;
LocalDate first = start.with( TemporalAdjusters.previousOrSame( dowStart ) ) ;

List<LocalDate> dates = new ArrayList<>() ;
LocalDate ld = first ; // Initialize for loop.
while( ld.isBefore( stop ) ) {  // While the local date is before the stopping point.
    dates.add( ld ) ;
    // Prepare for next loop.
    ld = ld.plusWeeks( 1 ) ;
}
int i = 0 ;  // Initialize for loop.
for( LocalDate ld : dates ) {
    i ++ ;
    String output = "Week # " + i + ":" + ld + " - " + ld.plusDays( 6 ) ;
    …
}