无法通过shell脚本创建月份

时间:2018-01-16 07:07:36

标签: java spring shell unix sh

我正在尝试通过路径

中的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;
        }

2 个答案:

答案 0 :(得分:0)

这段代码是你的问题:

<div></div>

整数不会存储为2位数字,01和1都存储为1.如果您想这样做,请写下以下内容:

int month = cal.get(Calendar.MONTH) + 1;

希望它有所帮助。

答案 1 :(得分:0)

TL;博士

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

你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是java.time类。

你忽略了时区的关键问题。时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的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。您可能也对课程YearMonth感兴趣。

String yearMonth = YearMonth.from( zdt ).toString() ;  // Generate string in standard ISO 8601 format YYYY-MM.