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