前两天遇到一个问题,,就是客户要求程序在一定周期月数里,提前几天给用户提示周期到了。比如说买了台笔记本,如果笔记本需要每三个月检查维护一次,那么在买笔记本这天后的每三个月里天前几天给销售人员提示,应该和客户联系维护电脑了。
由于每次维修的日期并不能判断得出,所以只能拿笔记本销售日期去比。
想了很久写出一下算法,程序里首先确定销售日期在加上n(n是自然数)个周期月数后的年份和月份与当天年份月份相同,然后判断是否符合提前的天数。
现把代码公开,希望大家指正,并提出更优算法。
/**
* 判断过去的某天(date)和当天是否间隔给定的月数(period)的给定天数(day)内
* @param date 过去的某天
* @param period 周期月数
* @param day 给定天数内
* @return
*/
@SuppressWarnings("deprecation")
public boolean date(Date date, int period, int day) {
boolean sameMonth = false;
Calendar oldCal = Calendar.getInstance();
oldCal.setTime(date);
// 当天日期信息
Date today = new Date();
Calendar newCal = Calendar.getInstance();
newCal.setTime(today);
int oldYear = oldCal.get(Calendar.YEAR);
int newYear = newCal.get(Calendar.YEAR);
//如果年份不一样
if(oldYear != newYear){
while (oldYear != newYear) {
oldCal.add(Calendar.MONTH, period);
// 如果年份不等就把交货日期月数循环加上周期月数
oldYear = oldCal.get(Calendar.YEAR);
int oldMonth = oldCal.get(Calendar.MONTH);
int newMonth = newCal.get(Calendar.MONTH);
if (oldYear == newYear && oldMonth < newMonth) {
// 如果年份相等并且交货月份小于当前月份
while (oldMonth < newMonth) {
oldCal.add(Calendar.MONTH, period);
oldMonth = oldCal.get(Calendar.MONTH);
// 如果月份相等,置true,跳出循环
if (oldMonth == newMonth) {
sameMonth = true;
break;
}
// 如果月份差小于周期月数,跳出循环
if (Math.abs(oldMonth - newMonth) < period) {
break;
}
}
}
}
}else{
//如果是同一年份
int oldMonth = oldCal.get(Calendar.MONTH);
int newMonth = newCal.get(Calendar.MONTH);
if (oldYear == newYear && oldMonth < newMonth) {
// 如果年份相等并且交货月份小于当前月份
while (oldMonth < newMonth) {
oldCal.add(Calendar.MONTH, period);
oldMonth = oldCal.get(Calendar.MONTH);
// 如果月份相等,置true,跳出循环
if (oldMonth == newMonth) {
sameMonth = true;
break;
}
// 如果月份差小于周期月数,跳出循环
if (Math.abs(oldMonth - newMonth) < period) {
break;
}
}
}
}
// 如果年月份都相等
if (sameMonth) {
// 判断两个日期间相差的天数是否小于要求的天数
Date oldDate = oldCal.getTime();
oldDate.setHours(23);
oldDate.setMinutes(59);
oldDate.setSeconds(59);
//判断时间间隔
long diff = oldDate.getTime() - today.getTime();
//System.out.println(diff);
long days = 0;
if (diff < 0){
days = diff;
diff = 0;
}else{
days = diff / (1000 * 60 * 60 * 24);
}
//如果间隔天数小于等于给定天数返回true。
if (days >= 0 && days <= day)
return true;
}
//否则返回false。
return false;
}
分享到:
相关推荐
关于Date、SimpleDateFormat、Calendar 、arraycopy 和 StringBuilder题目小结 对于题目的多种分析与解法
在Java编程语言中,`Date`和`Calendar`类是处理日期和时间的核心组件。这两个类在不同的Java版本中有着不同的使用方式和功能,对于理解Java时间处理机制至关重要。本篇将深入探讨`Date`和`Calendar`类的实例应用。 ...
【解析Date & Calendar类】 Java中的Date和Calendar类是处理日期和时间的核心工具。这两个类在Java编程中扮演着重要角色,特别是在处理日期计算、格式化以及与数据库交互时。 1. **java.util.Date** - **字符串转...
在这个示例中,我们首先创建了一个`Calendar`实例,设置了日期为2022年1月1日,然后将其转换为`Date`对象,并使用`SimpleDateFormat`进行格式化。接着,我们通过`Calendar.add()`方法增加了1年,再次进行格式化输出...
【Date类】 Date类是Java中用于处理时间和日期的...Date类是最基础的,而Calendar类提供了更丰富的操作,SimpleDateFormat则负责日期和时间的格式化和解析。在实际开发中,根据需求选择合适的类来处理日期和时间问题。
### Date与Calendar详解:深入理解Java中的日期与时间操作 #### Date类的解析与应用 在Java编程中,`java.util.Date`类是用于表示特定时刻的类,它以自格林尼治时间(GMT)1970年1月1日午夜以来经过的毫秒数来存储...
总结来说,Java中的`Date`和`Calendar`类提供了基本的时间处理功能,`DateFormat`和`SimpleDateFormat`则负责日期和时间的格式化,使我们能够根据需要将日期和时间转换为人类可读的字符串。在实际开发中,这些类经常...
Java中的Date和Calendar类是处理日期和时间的核心组件。Date类主要用于表示特定的瞬间,精确到毫秒。在早期版本的Java中,Date类的设计受到批评,因为它的API不直观且容易导致错误。为了解决这些问题,大部分日期和...
在Java编程语言中,`Date`和`Calendar`类是处理日期和时间的核心组件。这两个类在不同的Java版本中有着不同的用法和功能,对于理解并正确使用它们是Java开发者必备的知识点。 `Date`类在早期的Java版本中被广泛使用...
这里,我们使用了`SimpleDateFormat`类来解析字符串并转换为`Date`对象,然后将该`Date`对象设置到`Calendar`实例中。 #### 3. Date 转化为 String 将`Date`转换为`String`同样需要用到`SimpleDateFormat`。 ```...
在Java编程语言中,`Calendar`和`Date`类是处理日期和时间的核心组件。这两个类在处理日期、时间计算以及格式化等任务时扮演着关键角色。理解并熟练运用它们,对于提升Java开发能力至关重要。 `Date`类是Java早期...
将`Calendar`对象转换为`Date`,再用`SimpleDateFormat`格式化: ```java String dateString = formatter.format(calendar.getTime()); ``` 在实际开发中,Java 8引入了`java.time`包,其中的`LocalDateTime`、...
本源码资源提供了Java中的日期时间处理类相关内容,包括日期、时间和时区的操作方法和示例。它涵盖了Java编程中常用的日期时间处理需求以及如何使用日期时间类来解决这些问题。 适用人群 本源码资源适用于具备一定...
`java.util.Date`和`java.util.Calendar`是两个核心的类,用于表示和操作日期。尽管`Date`类提供了许多功能,但它的某些方法如`getYear()`、`getMonth()`等在后续版本中被废弃,取而代之的是使用`Calendar`类来进行...
在这个"JAVA System、Math、Date、DateFormat、Calendar"的主题中,我们将深入探讨Java标准库中的几个核心类,它们在各种程序设计场景中扮演着至关重要的角色。 首先,`System`类是Java中最基础的类之一,位于`java...
将一个符合特定格式的日期字符串转换为`Calendar`对象,首先需要使用`SimpleDateFormat`解析字符串得到`Date`,再将`Date`设置到`Calendar`中: ```java String str = "2012-5-27"; SimpleDateFormat sdf = new...
Java中的时区处理涉及到几个关键类:Date, Calendar, TimeZone, 和 SimpleDateFormat。这些类在处理时间日期时扮演着不同的角色。 1. **Date类**:Date对象代表的是一个时间点,精确到毫秒。它不包含任何时区信息,...
Java 中 Calendar 类的用法小结 ...Calendar 类和 Date 类是 Java 语言中用来处理日期和时间的基本类。通过使用这些类,我们可以轻松地取得当前时间,格式化日期数据,创建日期对象,和将文本数据解析成日期对象。
在Java编程语言中,`Calendar`类是处理日期和时间的核心工具类,它是一个抽象类,提供了各种日期和时间操作的方法...在实际项目中,结合使用`Calendar`、`Date`以及`SimpleDateFormat`,可以方便地处理日期相关的逻辑。
- **`Date`转`Calendar`**:首先创建一个`Calendar`实例,然后使用`setTime(Date)`方法将`Date`对象传递给`Calendar`实例。 ```java // `Calendar`转`Date` Calendar cal = Calendar.getInstance(); Date date = ...