Java 每周创建一个文件

Java 每周创建一个文件,java,Java,我有一个java程序,每天都要手动运行。 现在我想为wek创建一个excel文件,在其中写入一周的所有任务 我知道如何每天创建这样的文件: if(!IoUtils.fileExist("indicators-" + IoUtils.getCurrentDate() + ".xls")){ IoUtils.createIndicFile("indicators-" + IoUtils.getCurrentDate() + ".xls"); } else IoUtils.INDIC_FILE

我有一个java程序,每天都要手动运行。 现在我想为wek创建一个excel文件,在其中写入一周的所有任务

我知道如何每天创建这样的文件:

if(!IoUtils.fileExist("indicators-" + IoUtils.getCurrentDate() + ".xls")){
    IoUtils.createIndicFile("indicators-" + IoUtils.getCurrentDate() + ".xls");
}
else IoUtils.INDIC_FILEPATH = "indicators-" + IoUtils.getCurrentDate() + ".xls";
// first monday of january 2018
name = "indicators-week1-01-2018"

// second monday of january 2018
name = "indicators-week2-01-2018"
以下是以特定格式提供当前日期的函数:

// IoUtils class
public static String getCurrentDate(){
    LocalDateTime ldt = LocalDateTime.now();
    return DateTimeFormatter.ofPattern("dd-MM-yyyy", Locale.ENGLISH).format(ldt);
}
那么我如何才能将其更改为每周只创建一个文件

我还希望文件名中包含月份和周数,如下所示:

if(!IoUtils.fileExist("indicators-" + IoUtils.getCurrentDate() + ".xls")){
    IoUtils.createIndicFile("indicators-" + IoUtils.getCurrentDate() + ".xls");
}
else IoUtils.INDIC_FILEPATH = "indicators-" + IoUtils.getCurrentDate() + ".xls";
// first monday of january 2018
name = "indicators-week1-01-2018"

// second monday of january 2018
name = "indicators-week2-01-2018"

谢谢您

创建quartz cron作业调度程序
0 12?*周一

这将在每周一下午12:00安排作业。

创建quartz cron作业调度器
0 0 12?*周一

这将在每周一下午12:00安排作业。

因为您使用的是
LocalDateTime
,所以可以使用
getDayOfWeek
方法进行检查

例如

if(LocalDateTime.now().getDayOfWeek() == DayOfWeek.MONDAY){
  // File Creation Logic ...
}    

由于您使用的是
LocalDateTime
,因此可以使用
getDayOfWeek
方法进行检查

例如

if(LocalDateTime.now().getDayOfWeek() == DayOfWeek.MONDAY){
  // File Creation Logic ...
}    
Java提供了Java.util.concurrent.ScheduledThreadPoolExecutor,它还可以安排命令在给定延迟后运行,或定期执行

Scheduler.scheduleWithFixedDelay(task, StartDelay, repeatInterval, TimeUnit.MINUTES);
Java提供了Java.util.concurrent.ScheduledThreadPoolExecutor,它还可以安排命令在给定延迟后运行,或定期执行

Scheduler.scheduleWithFixedDelay(task, StartDelay, repeatInterval, TimeUnit.MINUTES);

使用日历API,calendar.get(calendar.DAY\u OF_WEEK)将在周一返回int 2

import java.util.Calendar;

if(calendar.get(Calendar.DAY_OF_WEEK) == 2)
  if(!IoUtils.fileExist("indicators-" + IoUtils.getCurrentDate() + ".xls")){
      IoUtils.createIndicFile("indicators-" + IoUtils.getCurrentDate() + ".xls");
  }
  else IoUtils.INDIC_FILEPATH = "indicators-" + IoUtils.getCurrentDate() + ".xls";

使用日历API,calendar.get(calendar.DAY\u OF_WEEK)将在周一返回int 2

import java.util.Calendar;

if(calendar.get(Calendar.DAY_OF_WEEK) == 2)
  if(!IoUtils.fileExist("indicators-" + IoUtils.getCurrentDate() + ".xls")){
      IoUtils.createIndicFile("indicators-" + IoUtils.getCurrentDate() + ".xls");
  }
  else IoUtils.INDIC_FILEPATH = "indicators-" + IoUtils.getCurrentDate() + ".xls";
然后,您可以检查文件是否存在,写入同一个文件,如果文件不存在,您将创建一个具有预期文件名的新文件,并写入该新文件。但根据要求,应适当处理年假

然后,您可以检查文件是否存在,写入同一个文件,如果文件不存在,您将使用预期的文件名创建一个新文件,并写入该新文件。但根据要求,执行者应正确处理年假

旧式的方式是使用
计时器
上课

新的学校方式使用在后台线程上处理调度任务的细节

设置执行器,使其每隔几个小时运行一次
Runnable
。该任务检查当前时刻。如果当前日期的星期几是星期一,并且您的文件尚未写入,请将其写入。如果没有,则让Runnable过期。该程序将在几个小时后再次运行,并重复一次又一次

第一步是获取当前日期

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能在运行时(!)期间出现,因此您的结果可能会有所不同。最好将您的参数显式指定为参数

大陆/地区
的格式指定,例如
美国/蒙特利尔
非洲/卡萨布兰卡
,或
太平洋/奥克兰
。切勿使用2-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

从中可以得到一周中的当前日期

DayOfWeek dow = today.getDayOfWeek() ;
如果今天是星期一,则查看文件是否已写入。如果没有,写下来

if( dow.equals( DayOfWeek.MONDAY ) ) {
    if( file not written ) { write file }
}
将所有这些放在一个命名方法中

private void writeFileOnMonday ( ) {
    ZoneId z = ZoneId.of( "America/Montreal" );
    LocalDate today = LocalDate.now( z );
    DayOfWeek dow = today.getDayOfWeek();
    if ( dow.equals( DayOfWeek.MONDAY ) ) {
        if ( file not written ){ write file }
    }
}
以一种全新的方式利用这一工作量。指定两次运行之间等待的小时数。如果我们指定每3小时运行一次任务,那么,按照逻辑,我们的每周文件将在每周一午夜到凌晨3点之间的某个时间写入

计划执行器服务的一个大问题是:如果在任何运行中任务抛出(或)并到达执行器,则重复任务的执行会无声地停止。所以,一定要把你的任务包装在一个“尝试捕捉”中。看

搜索堆栈溢出以获取更多信息,因为所有这些都已经被讨论过很多次了


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android(Executor 旧式的方式是使用
      计时器
      上课

      新的学校方式使用在后台线程上处理调度任务的细节

      设置一个执行器,使其每隔几个小时运行一次可运行的
      Runnable
      。该任务将检查当前时刻。如果当前日期的星期一是星期一,并且您的文件尚未写入,请写入。如果未写入,则让可运行任务过期。该任务将在几个小时后再次运行,并重复多次

      第一步是获取当前日期

      时区对于确定日期至关重要。对于任何给定的时刻,全球各地的日期都因区域而异。例如,年午夜后几分钟是新的一天,而年仍然是“昨天”

      如果未指定时区,JVM将隐式应用其当前默认时区。该默认时区可能在运行时(!)期间出现,因此您的结果可能会有所不同。最好将您的值显式指定为参数

      在格式中指定一个