我已经看过这个论坛了,我得到了一些答案,但它不太适合我的问题。
所以问题是(这是一项大学作业):我必须在将来的某个特定时间(由程序的用户来定义)来安排一项任务。
首先,我开始尝试通过这样的方式选择一个日期来实现这个目标:
//this is my main class
DateFormat dateFormatter = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
String year = String.valueOf(LocalDate.now().getYear());
String month = String.valueOf(LocalDate.now().getMonthValue());
String day = "05";
Date date = dateFormatter.parse(year + "-" + month + "-" + day + " 02:24:08");
Timer timer = new Timer();
timer.schedule(new MyTimeTask("Patrick"), date);
//the class MyTimeTask:
public class MyTimeTask extends TimerTask {
private String name;
public MyTimeTask(String name) {
this.name = name;
}
public void run() {
System.out.println(this.name);
}
}问题是:这不能在我想要的时候运行。相反,只要我运行该文件,它就会自动运行,无论将来我选择日期有多远。
我哪里错了?
谢谢。
发布于 2020-06-05 02:00:49
您的代码中有一些需要解决的问题。
首先是这样的:new SimpleDateFormat("yyyy-mm-dd hh:mm:ss")。仔细看看你的模式。yyyy-mm-dd hh:mm:ss翻译成year-minute-day hour:minute:second。我相信你想要的是一年后的一个月,而不是一分钟。对yyyy-MM-dd hh:mm:ss的简单更改就可以解决这个问题。
其次,LocalDate.now().getMonthValue() (目前)正在返回6 (而不是06),因此您的模式yyyy:MM:dd与它不匹配。为了解决这个问题,我会将您的年份字符串和月份字符串组合成一个变量,这样您就可以使用DateTimeFormatter将月份格式化为MM:
String yearMonth = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM"));现在您可以像这样解析您的约会对象:
Date date = dateFormatter.parse(yearMonth + "-" + day + " 02:24:08");我要做的最后一件事(这不是完全必要的)是指定给定的时间是前子午线还是后子午线,或者将时间改为军事时间。要做到这一点,您可以添加"aa“到您的日期格式化程序结束。
下面是最后的代码:
DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ssaa");
String yearMonth = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM"));
String day = "04";
Date date = dateFormatter.parse(yearMonth + "-" + day + " 02:24:08PM");
Timer timer = new Timer();
timer.schedule(new MyTimeTask("Patrick"), date);发布于 2020-06-05 04:34:06
java.time
您已经在使用来自LocalDate的java.time,这是一种现代的java.time和time。那很好。当Timer.schedule()需要一个老式的java.util.Date对象时:
在调用需要一个exclusicely.
Instant.
Instant.
Instant到Date的时间计算。为了你的目的,我建议:
ZoneId zone = ZoneId.systemDefault();
Instant scheduleTime = YearMonth.now(zone)
.atDay(5)
.atTime(LocalTime.of(2, 24, 8))
.atZone(zone)
.toInstant();
Date oldfashionedDate = Date.from(scheduleTime);
System.out.println(oldfashionedDate);刚才在我的时区运行时输出:
周五6月05 02:24:08欧洲夏令时间2020年
你的代码出了什么问题?
yyyy-mm-dd hh:mm:ss是错误的。格式模式字母区分大小写,因此无论使用大写MM还是小写mm,还是使用HH或hh,都会产生影响。我相信这就是您的定时器触发prematurely.LocalDate.now(),即使您传递的时区是ZoneId.systemDefault().LocalDate.now()两次。如果您的代码运行超过午夜,您可能会得到两个不同的日期和一个不一致的结果在最后。阅读一次日期,并在其余代码中使用该读取。https://stackoverflow.com/questions/62206707
复制相似问题