每周创建一个文件

时间:2018-11-28 09:36:18

标签: java

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

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

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

以下是以特定格式为我提供当前日期的函数:

// IoUtils class
public static String getCurrentDate(){
    LocalDateTime ldt = LocalDateTime.now();
    return DateTimeFormatter.ofPattern("dd-MM-yyyy", Locale.ENGLISH).format(ldt);
}

那么我该如何更改为每周仅创建一个文件?

我还希望这样的文件名中包含月份和星期几:

// first monday of january 2018
name = "indicators-week1-01-2018"

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

谢谢

7 个答案:

答案 0 :(得分:1)

Java提供了 java.util.concurrent.ScheduledThreadPoolExecutor ,可以另外安排命令在给定延迟后运行或定期执行。

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

答案 1 :(得分:1)

执行者

老式的方法使用了Timer类。

新派方式使用Executors framework处理后台线程上调度任务的细节。

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

第一步是获取当前日期。

时区对于确定日期至关重要。在任何给定时刻,日期都会在全球范围内变化。例如,Paris France午夜之后的几分钟是新的一天,而Montréal Québec仍然是“昨天”。

如果未指定时区,则JVM隐式应用其当前的默认时区。该默认值可能在运行时(!)期间change at any moment,因此您的结果可能会有所不同。最好将desired/expected time zone明确指定为参数。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用2-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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 }
}

将所有内容一起放入命名方法中。

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 }
    }
}

利用scheduled executor service中的工作负载。指定两次运行之间要等待的小时数。如果我们指定每3小时运行一次任务,则逻辑决定,我们的每周文件将在每个星期一的午夜至凌晨3点之间的某个时间写入。

使用计划的执行程序服务的一个大问题是:如果在任何运行中,任务抛出了ThrowableExceptionError),重复执行任务就会默默地停止,并到达执行者。因此,始终将您的任务包装在try-catch中。参见this Question

ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();  // Convenience method to produce an executor service.

ScheduledFuture scheduledFuture =          // A handle to check the status of your task. May or may not be useful to you.
        scheduledExecutorService
                .scheduleWithFixedDelay( new Runnable() {  // Implement the `Runnable` interface as your task. 
                                             @Override
                                             public void run ( ) {
                                                 try {
                                                     writeFileOnMonday();
                                                 } catch (Exception e ) {
                                                     … handle unexected exception
                                                 }
                                             }
                                         } ,
                        0 ,                 // Initial delay
                        3 ,                 // Delay between runs.
                        TimeUnit.HOURS );   // Unit of time meant for the pair of delay numbers above.

搜索堆栈溢出以获取更多信息,因为所有这些已经被覆盖很多次了。


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

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

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

使用Calendar

Calendar cal = Calendar.getInstance();
int currentDay = cal.get(Calendar.DAY_OF_WEEK); 
if (currentDay == Calendar.MONDAY) {
    // write your code here
}

答案 3 :(得分:0)

创建一个石英cron作业调度程序0 0 12 ? * MON。 这将在每个星期一的中午12:00安排工作。

答案 4 :(得分:0)

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

例如

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

答案 5 :(得分:0)

使用日历API,calendar.get(Calendar.DAY_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";

答案 6 :(得分:0)

Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);
int week = cal.get(Calendar.WEEK_OF_YEAR);

String expectedFileName = "indicators-week"+week+"-whateveryouwant-"+cal.get(Calendar.YEAR);

然后,您可以检查文件是否存在,并写入同一文件;如果文件不存在,则将使用期望的文件名创建一个新文件,然后写入该新文件。正确处理