我有一个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"
谢谢
答案 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/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用2-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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点之间的某个时间写入。
使用计划的执行程序服务的一个大问题是:如果在任何运行中,任务抛出了Throwable
(Exception
或Error
),重复执行任务就会默默地停止,并到达执行者。因此,始终将您的任务包装在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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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);
然后,您可以检查文件是否存在,并写入同一文件;如果文件不存在,则将使用期望的文件名创建一个新文件,然后写入该新文件。正确处理