如何在文件列表中重新格式化日期名称

时间:2019-05-21 17:18:39

标签: groovy

我有一个文件列表:

  • xxx_05102019023601017.csv
  • xxx_05092019023601036.csv
  • xxx_05082019023600900.csv

使用Groovy(或Java),我需要从文件名列表中提取日期并将其重新格式化,以使年份处于领先地位。像这样...

  • xxx_20190510023601017.csv
  • xxx_20190509023601036.csv
  • xxx_20190508023600900.csv

是否有一种光滑的Groovy方法来实现这一目标?

2 个答案:

答案 0 :(得分:3)

我看不到需要使用日期解析/格式化

仅使用正则表达式交换两个部分

def oldName = "xxx_05102019023601017.csv"
def newName = oldName.replaceAll(/^(\D+)(\d{4})(\d{4})/,'$1$3$2')

退出:

xxx_20190510023601017.csv

regexp解释:

enter image description here

https://regex101.com/r/X0u9wv/1

String.replaceAll(正则表达式,替换)

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#replaceAll-java.lang.String-java.lang.String-

replacement-每个匹配项替换的字符串

$1 $2$3对应于regexp中的每个(...),所以我只交换替换的2nd和3d组

答案 1 :(得分:1)

使用正则表达式的Answer by daggett很漂亮。如果好奇的话,这里是处理日期时间的方法。

java.time

  

xxx_05102019023601017.csv

我假设这些数字代表月,日,年,时,分,秒,毫秒。

输入

通过调用Split your string在下划线上

String::split

String input = "foobar_05102019023601017.csv" ;
String[] parts = string.split( "_" ) ;
String part1 = parts[0]; // foobar
String part2 = parts[1]; // 05102019023601017.csv

定义格式化程序以匹配第二部分。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "ddMMuuuuHHmmssSSS'.csv'" ) ;

解析为LocalDateTime对象,因为您的输入缺少任何时区指示或UTC偏移量。

LocalDateTime ldt = LocalDateTime.parse( part2 , f ) ;

输出

定义输出的格式化程序。

DateTimeFormatter formatterOutput = DateTimeFormatter.ofPattern( "uuuuMMddHHmmssSSS" ) ;

生成输出。

String datetimeOutput = ldt.format( formatterOutput ) ;
String prefix = part1 + "_" ;
String suffix = ".csv" ;
String output = prefix + datetimeOutput + suffix ;

或更简洁地说,对单层衬里使用StringBuilder

String output = new StringBuilder()
    .append( part1 ) 
    .append( "_" ) 
    .append( ldt.format( formatterOutput ) )
    .append( ".csv") 
    .toString() 
;

ISO 8601

您的格式接近标准ISO 8601格式的“基本”变体。我建议在可行的情况下使用这些标准格式。为了符合规定,请在年月日部分和时分秒部分之间插入T

为此,请更改DateTimeFormatter模式。将字母插入一对单引号内:'T'

DateTimeFormatter formatterOutput = DateTimeFormatter.ofPattern( "uuuuMMdd'T'HHmmssSSS" ) ;

区域/偏移量

没有指定时区或UTC偏移的日期和时间是模棱两可的,因此容易造成误解。我建议始终包括区域或偏移量以便清楚地沟通。

如果此日期和时间用于表示UTC时刻(通常是个好主意),则只需附加一个Z。该字母表示UTC,或零小时-分钟-秒的偏移量。这封信的发音是“祖鲁语”。

String output = new StringBuilder()
    .append( part1 ) 
    .append( "_" ) 
    .append( ldt.format( formatterOutput ) )
    .append( "Z" ) 
    .append( ".csv") 
    .toString() 
;