输入年或月自动生成开始和结束时间

本文介绍了一种通过输入四位或六位数字代码自动生成对应年份或月份的时间范围的方法。具体包括如何判断输入的有效性,如何根据年份生成整年的起始和结束日期,以及如何进一步细分到每个月并为每个月生成准确的起始和结束日期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目的计划周期中,经常需要添加一个计划期间,可以通过输入计划期间的年或月自动生成对应的开始和结束时间。只输入红色框内的编码,自动生成效果如下:





if ((isNumeric((String) code) && (((String) code).length() == 4))

|| (isNumeric((String) code) && (((String) code).length() == 6))) {
Object name = null; // 名称
int intCode = Integer.parseInt(((String) code));// 把输入的code编码转换成int
// 添加的是一年时
if (code != null && intCode > 1949 && intCode < 2149) {
name = e.getBillCardPanel().getBodyValueAt(selectrow, "code");
int year = intCode;// 当前输入的年的值
name = (String) name + "年";
e.getBillCardPanel().setBodyValueAt(name, selectrow, "name");
ilevel = 1;
e.getBillCardPanel().setBodyValueAt(ilevel, (selectrow),
"ilevel");
// 一年的开始时间
String startd = year + "-01-01 00:00:00";
UFDateTime startdate1 = new UFDateTime(startd);
e.getBillCardPanel().setBodyValueAt(startdate1, selectrow,
"startdate");
// 一年的 结束时间
String endd = year + "-12-31 23:59:59";
UFDateTime enddate1 = new UFDateTime(endd);
e.getBillCardPanel().setBodyValueAt(enddate1, selectrow,
"enddate");


// 批量增加月份
if (ilevel.equals(1)) {
String pk_group = e.getContext().getPk_group();
for (int i = 0; i < 12; i++) {// 循环12次表示12个月
e.getBillCardPanel().getBillModel().addLine();
int rownum = e.getBillCardPanel().getBillTable()
.getRowCount();
creator = e.getContext().getPk_loginUser();
e.getBillCardPanel().setBodyValueAt(creator, selectrow,
"creator");
code = e.getBillCardPanel().getBodyValueAt(selectrow,
"code");
// 1~9月
if (i + 1 < 10) {
name = (String) code + "年0" + (i + 1) + "月";
e.getBillCardPanel().setBodyValueAt(name,
(selectrow + i + 1), "name");
code = (String) code + 0 + (i + 1);
e.getBillCardPanel().setBodyValueAt(code,
(selectrow + i + 1), "code");
ilevel = 2;
e.getBillCardPanel().setBodyValueAt(ilevel,
(selectrow + i + 1), "ilevel");
// 当前月份的 开始时间
int m = i + 1;
String mstartd = year + "-" + m + "-01 00:00:00";
UFDateTime startdate = new UFDateTime(mstartd);
e.getBillCardPanel().setBodyValueAt(startdate,
(selectrow + i + 1), "startdate");
// 当前月份的 结束时间
String mendd;
// 二月闰年时
if (m == 2
&& (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)) {
mendd = year + "-" + m + "-29 23:59:59";
UFDateTime enddate = new UFDateTime(mendd);
e.getBillCardPanel().setBodyValueAt(enddate,
(selectrow + i + 1), "enddate");
} else if (m == 2) {// 二月非闰年
mendd = year + "-" + m + "-28 23:59:59";
UFDateTime enddate = new UFDateTime(mendd);
e.getBillCardPanel().setBodyValueAt(enddate,
(selectrow + i + 1), "enddate");
} else if (m == 4 || m == 6 || m == 9) {// 4 6 9 月
mendd = year + "-" + m + "-30 23:59:59";
UFDateTime enddate = new UFDateTime(mendd);
e.getBillCardPanel().setBodyValueAt(enddate,
(selectrow + i + 1), "enddate");
}
// 1 3 5 7 8 10 12月
else {
mendd = year + "-" + m + "-31 23:59:59";
UFDateTime enddate = new UFDateTime(mendd);
e.getBillCardPanel().setBodyValueAt(enddate,
(selectrow + i + 1), "enddate");
}
}
// 10~12月
else {
name = (String) code + "年" + (i + 1) + "月";
e.getBillCardPanel().setBodyValueAt(name,
(selectrow + i + 1), "name");
code = (String) code + (i + 1);
e.getBillCardPanel().setBodyValueAt(code,
(selectrow + i + 1), "code");
ilevel = 2;
e.getBillCardPanel().setBodyValueAt(ilevel,
(selectrow + i + 1), "ilevel");
// 当前月份的 开始时间
int m = i + 1;
startd = year + "-" + m + "-01 00:00:00";
UFDateTime startdate = new UFDateTime(startd);
e.getBillCardPanel().setBodyValueAt(startdate,
(selectrow + i + 1), "startdate");
// 结束时间
String mendd;
if (m == 11) {
mendd = year + "-" + m + "-30 23:59:59";
UFDateTime enddate = new UFDateTime(mendd);
e.getBillCardPanel().setBodyValueAt(enddate,
(selectrow + i + 1), "enddate");
} else {
mendd = year + "-" + m + "-31 23:59:59";
UFDateTime enddate = new UFDateTime(mendd);
e.getBillCardPanel().setBodyValueAt(enddate,
(selectrow + i + 1), "enddate");
}
}
}
}
}
// 添加的是一个月的时候
else if (code != null && intCode > 194900 && intCode < 214913) {
name = e.getBillCardPanel().getBodyValueAt(selectrow, "code");
String month = ((String) name).substring(((String) name)
.length() - 2);// 截取月份
int m = Integer.parseInt(month);
// 月份必须是1~12
if ((m > 0) && (m <= 12)) {
if ((m > 0) && (m <= 9)) {// 1到9月
name = ((String) name).substring(0, 4);
int year = Integer.parseInt((String) name);// 年
month = month.substring(1);
name = (String) name + "年" + "0" + month + "月";
e.getBillCardPanel().setBodyValueAt(name, selectrow,
"name");
ilevel = 2;
e.getBillCardPanel().setBodyValueAt(ilevel,
(selectrow), "ilevel");
// 开始时间
String startd = ((String) code).substring(0, 4) + "-"
+ month + "-01 00:00:00";
UFDateTime startdate1 = new UFDateTime(startd);
e.getBillCardPanel().setBodyValueAt(startdate1,
selectrow, "startdate");


// 结束时间
String endd = null;
if (Integer.parseInt(month) == 4
|| Integer.parseInt(month) == 6
|| Integer.parseInt(month) == 9) {
endd = ((String) code).substring(0, 4) + "-"
+ month + "-30 23:59:59";
} else if (Integer.parseInt(month) == 2) {
if (year % 4 == 0 && year % 100 != 0
|| year % 400 == 0) {
endd = ((String) code).substring(0, 4) + "-"
+ month + "-29 23:59:59";
} else {
endd = ((String) code).substring(0, 4) + "-"
+ month + "-28 23:59:59";
}
} else {
endd = ((String) code).substring(0, 4) + "-"
+ month + "-31 23:59:59";
}
UFDateTime enddate1 = new UFDateTime(endd);
e.getBillCardPanel().setBodyValueAt(enddate1,
selectrow, "enddate");


}
// 10~12月
else {
name = ((String) name).substring(0, 4);
name = (String) name + "年" + month + "月";
e.getBillCardPanel().setBodyValueAt(name, selectrow,
"name");
ilevel = 2;
e.getBillCardPanel().setBodyValueAt(ilevel,
(selectrow), "ilevel");
// 当前月份的开始时间
String startd = ((String) code).substring(0, 4) + "-"
+ month + "-01 00:00:00";
UFDateTime startdate1 = new UFDateTime(startd);
e.getBillCardPanel().setBodyValueAt(startdate1,
selectrow, "startdate");
// 11月只有30天
if (Integer.parseInt(month) == 11) {
String endd = ((String) code).substring(0, 4) + "-"
+ month + "-30 23:59:59";
UFDateTime enddate1 = new UFDateTime(endd);
e.getBillCardPanel().setBodyValueAt(enddate1,
selectrow, "enddate");
} else if (Integer.parseInt(month) == 10
|| Integer.parseInt(month) == 12) {
// 12月有31天
String endd = ((String) code).substring(0, 4) + "-"
+ month + "-31 23:59:59";
UFDateTime enddate1 = new UFDateTime(endd);
e.getBillCardPanel().setBodyValueAt(enddate1,
selectrow, "enddate");
}
}
}
// 输入的是六位数,但是后面两位数不在1~12之间(即月份不在1~12范围内)
else {
code = null;
e.getBillCardPanel()
.setBodyValueAt(code, selectrow, "code");
name = null;
e.getBillCardPanel()
.setBodyValueAt(name, selectrow, "name");
ilevel = null;
e.getBillCardPanel().setBodyValueAt(ilevel, (selectrow),
"ilevel");
}


}
// 输入的不是四位数或六位数数字的时候
// else if (((String) code).length() != 4 || ((String)
// code).length() !=
// 6)
else {
code = null;
e.getBillCardPanel().setBodyValueAt(code, selectrow, "code");
name = null;
e.getBillCardPanel().setBodyValueAt(name, selectrow, "name");
return;
}
}
<think>好的,用户想要设计一个根据计划清单的时间自动提醒开始结束的系统。首先,我需要理解用户的具体需求。他们可能希望有一个工具应用,能够自动监控任务的时间,并在任务开始结束时发送提醒。可能用户经常忘记任务的时间者需要更高效地管理自己的日程。 接下来,我需要考虑如何构建这样一个系统。可能需要以下几个模块:任务输入时间解析、提醒触发、通知推送,以及可能的任务跟踪历史记录。然后要确定每个模块的具体实现方式。 任务输入部分,用户需要能够添加任务,包括任务名称、开始时间结束时间,可能还有优先级、重复设置等。时间解析模块需要处理用户输入时间,可能是自然语言处理,比如“明天下午三点”者具体的日期时间格式。提醒触发模块需要持续检查当前时间,当接近任务开始结束时触发提醒。通知推送则需要通过系统通知、短信、邮件等方式发送提醒。 还需要考虑用户可能需要的功能,比如重复任务、提前提醒的时间设置、多平台同步等。另外,用户体验也很重要,界面要简洁易用,提醒要及时准确,不能打扰用户过多。 然后,技术选型方面,如果是开发一个应用,可能需要前端后端。前端可以用React NativeFlutter实现跨平台,后端用Node.jsPython处理逻辑存储。数据库方面,可能需要用SQLiteMongoDB来存储任务数据。对于时间解析,可能需要用到类似Moment.jsdate-fns的库来处理时间。提醒触发可能需要用到定时任务,比如Node的node-schedule者Python的APScheduler。 测试时需要考虑不同时区、夏令时等问题,确保时间计算的准确性。另外,提醒的及时性也很关键,可能需要后台服务持续运行,者利用操作系统的定时任务功能。 用户可能没有说出来的深层需求,可能是希望减少手动设置提醒的麻烦,者需要集成到现有的日历应用中。也可能需要任务完成后的反馈机制,比如标记任务为完成,者调整任务时间。 安全性隐私也需要考虑,用户的任务数据可能包含敏感信息,需要加密存储传输。如果是多用户系统,还需要身份验证权限管理。 最后,可能还需要考虑扩展功能,比如数据分析,统计任务完成情况,生成报告等,帮助用户更好地管理时间。 总的来说,设计这样一个系统需要综合考虑功能模块、技术实现、用户体验数据安全等方面,确保系统稳定可靠,提醒准确及时。设计</think>一个根据计划清单自动触发时间提醒的系统,可以按照以下步骤实现(附技术关键点): --- ### **一、核心功能模块** 1. **任务录入管理** - 支持自然语言输入(如"明天14点写报告/持续2小时") - 手动模式:精确设置开始/结束时间 - 支持重复任务(每天/每周循环) - *技术点:正则表达式解析时间短语,日期计算库(如moment.js)* 2. **智能时间监控** - 时区自动适配 - *技术点:定时任务框架(如APScheduler),系统级后台服务* 3. **多维度提醒系统** - 弹窗震动(移动端) - 语音播报(如Google TTS) - 跨设备推送(通过Firebase等云服务) - 紧急任务分级提醒(颜色/频率区分) - *技术点:系统通知API,WebSocket实时通信* 4. **状态追踪反馈** - 任务进度可视化(时间线/甘特图) - 完成确认机制(防误触设计) - 超时自动标记统计 - *技术点:数据可视化库(Echarts/D3.js),本地数据库存储* --- ### **二、技术实现方案** ```python # 伪代码示例(基于Python) from apscheduler.schedulers.background import BackgroundScheduler from plyer import notification import datetime class TaskReminder: def __init__(self): self.scheduler = BackgroundScheduler() self.tasks = [] # 存储任务对象 def parse_time(self, natural_str): # 实现自然语言时间解析 # 示例:将"30分钟后"转换为具体时间 return calculated_time def add_task(self, name, start, end): # 添加双触发器:开始前提醒+结束时提醒 self.scheduler.add_job(self.notify_start, 'date', run_date=start) self.scheduler.add_job(self.notify_end, 'date', run_date=end) def notify_start(self): notification.notify( title='任务即将开始', message=f'准备执行:{task.name}', timeout=10 ) def notify_end(self): notification.notify( title='任务时间结束', message=f'请检查完成情况:{task.name}', timeout=10 ) # 使用示例 reminder = TaskReminder() reminder.add_task("项目会议", datetime(2023,8,15,14,0), datetime(2023,8,15,16,0)) reminder.scheduler.start() ``` --- ### **三、进阶优化方向** 1. **AI预测调整** - 根据历史完成时间自动校准任务时长 - 基于当前负荷智能推荐任务安排 2. **多端同步方案** - Web端:浏览器通知+本地存储 - 移动端:React Native + 原生推送服务 - 桌面端:Electron集成系统托盘图标 3. **防干扰机制** - 勿扰时段自动静默 - 连续任务批量提醒 - 依赖任务链式触发 --- ### **四、现成解决方案推荐** 若需快速实现,可基于现有工具组合: 1. **Microsoft To Do** + **Flow**自动化 2. **Google Calendar** + **IFTTT**触发提醒 3. **Todoist高级版** 智能日期识别功能 -- 建议优先验证核心需求,采用MVP模式逐步迭代。如需自建系统,注意处理好后台进程保活、精确时间触发等关键技术难点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值