首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将任务安排在特定时间(用Java)

将任务安排在特定时间(用Java)
EN

Stack Overflow用户
提问于 2020-06-05 01:31:55
回答 2查看 687关注 0票数 0

我已经看过这个论坛了,我得到了一些答案,但它不太适合我的问题。

所以问题是(这是一项大学作业):我必须在将来的某个特定时间(由程序的用户来定义)来安排一项任务。

首先,我开始尝试通过这样的方式选择一个日期来实现这个目标:

代码语言:javascript
复制
//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);
           }
        }

问题是:这不能在我想要的时候运行。相反,只要我运行该文件,它就会自动运行,无论将来我选择日期有多远。

我哪里错了?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

代码语言:javascript
复制
String yearMonth = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM"));

现在您可以像这样解析您的约会对象:

代码语言:javascript
复制
Date date = dateFormatter.parse(yearMonth + "-" + day + " 02:24:08");

我要做的最后一件事(这不是完全必要的)是指定给定的时间是前子午线还是后子午线,或者将时间改为军事时间。要做到这一点,您可以添加"aa“到您的日期格式化程序结束。

下面是最后的代码:

代码语言:javascript
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2020-06-05 04:34:06

java.time

您已经在使用来自LocalDate的java.time,这是一种现代的java.time和time。那很好。当Timer.schedule()需要一个老式的java.util.Date对象时:

在调用需要一个exclusicely.

  • Convert的遗留API之前,使用Instant.

  • Convert对现代Instant.

  • Convert进行InstantDate的时间计算。

为了你的目的,我建议:

代码语言:javascript
复制
    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年

你的代码出了什么问题?

  1. 您的格式模式字符串yyyy-mm-dd hh:mm:ss是错误的。格式模式字母区分大小写,因此无论使用大写MM还是小写mm,还是使用HHhh,都会产生影响。我相信这就是您的定时器触发prematurely.
  2. As的原因--这是一个清晰的代码问题--我更愿意将一个时区传递给LocalDate.now(),即使您传递的时区是ZoneId.systemDefault().
  3. Don’t,读取LocalDate.now()两次。如果您的代码运行超过午夜,您可能会得到两个不同的日期和一个不一致的结果在最后。阅读一次日期,并在其余代码中使用该读取。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62206707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档