我正在尝试通过路径
中的shell脚本创建存档文件的路径/folder1/folder2/archive/YYYY/MM/incoming
shell脚本:
#!/bin/bash
BACKUP_DIR=/folder1/folder2/archieve
YEAR_DIR=$(date +%Y)
MON_DIR=$(date +%m)
echo "Creating archive folder!!!"
mkdir -p "${BACKUP_DIR}/${YEAR_DIR}/${MON_DIR}/incoming"
mkdir -p "${BACKUP_DIR}/${YEAR_DIR}/${MON_DIR}/outgoing"
mkdir -p "${BACKUP_DIR}/${YEAR_DIR}/${MON_DIR}/FAILED"
同样在application.properties文件中,我有以下配置:
application.properties.xml
#Config for file locations
#spring.archiving.filePath= /folder1/folder2/archieve/YYYY/MM/incoming
#spring.archiving.backup.filePath=/folder1/folder2/archieve/YYYY/MM/outgoing
#spring.archiving.failed.filePath= /folder1/folder2/archieve/YYYY/MM/FAILED
然而,java正在使用/YYYY/M/
它创建了几个月的文件夹,其中包含November(11)
December(12)
等2位数字。但对于January
,它使用1
而不是01
。因此,文件未归档到正确的位置。任何人都可以帮助吗? shell脚本或application.properties文件有什么问题?我正在使用spring boot应用程序。
**Java is handling this as below:**
//Process method reads the archieving path mentioned in properties.xml file
public void process(Mapper mapper) {
this.archivingFilepath =
this.renameFilePathWithDate(this.archivingFilepath);
}
**This method helps to rename file path with year and month**
public String renameFilePathWithDate(String filePath) {
final String yearString = "YYYY";//creating variables for year
and month
final String monthString = "MM";
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
String newFilePath = filePath.replaceAll(yearString,
String.valueOf(year));
newFilePath = newFilePath.replaceAll(monthString,
String.valueOf(month));
return newFilePath;
}
答案 0 :(得分:0)
这段代码是你的问题:
<div></div>
整数不会存储为2位数字,01和1都存储为1.如果您想这样做,请写下以下内容:
int month = cal.get(Calendar.MONTH) + 1;
希望它有所帮助。
答案 1 :(得分:0)
String.format( // Make text of a number.
"%02d" , // Pad with leading zero for January-September.
ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ) // Get current moment in a particular time zone.
.getMonthValue() // Interrogate for the number of the month.
)
你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是java.time类。
你忽略了时区的关键问题。时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" );
如果要使用JVM的当前默认时区,请求它并作为参数传递。省略该区域会导致隐式应用JVM的当前默认值。最好是明确的。
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
通过实例化ZonedDateTime
来获取该区域的当前时刻。
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
如果您希望将年份和月份作为字符串,请询问int
和格式。请注意,与传统的日期时间类不同,月份在java.time中具有合理的编号,1月到12月的编号为1-12。
String year = String.format( "%04d" , zdt.getYear() ) ; // Obviously not needed for contemporary years, but FYI.
String month = String.format( "%02d" , zdt.getMonthValue() ) ; // Pad with leading zero for single-digit months January-September.
顺便说一句,你可能会发现年月在这类工作中很有用。 YearMonth
类代表了这样的事情,ISO 8601标准定义了文本格式YYYY-MM
。您可能也对课程Year
和Month
感兴趣。
String yearMonth = YearMonth.from( zdt ).toString() ; // Generate string in standard ISO 8601 format YYYY-MM.