使用Java命名文件以包含日期和时间戳

时间:2015-09-15 13:13:14

标签: java file netbeans timestamp filenames

我使用NetBeans将数据导出到Java应用程序中的文件中。该文件将具有我在代码中给出的硬编码名称。请在下面找到代码。

private static String FILE = "D:\\Report.pdf";

我想在生成的文件名后附加日期和时间戳,以便创建的每个文件都是唯一的文件。怎么做到这一点?

3 个答案:

答案 0 :(得分:2)

使用SimpleDateFormat并拆分以保留文件扩展名:

<

更新:
如果您能够修改Optional变量,我的建议将是:

private static String FILE = "D:\Report.pdf";
DateFormat df = new SimpleDateFormat("yyyyMMddhhmmss"); // add S if you need milliseconds
String filename = FILE.split(".")[0] + df.format(new Date()) + FILE.split(".")[1];
// filename = "D:\Report20150915152301.pdf"

答案 1 :(得分:1)

你可以做那样的事情

定义您的文件名模式,如下所示:

private static final String FILE = "D:\Report_{0}.pdf";
private static final String DATE_PATTERN = "yyyy-MM-dd:HH:mm:ss";

{0}是要被以下代码替换的标记

private String formatFileName(Date timeStamp) {
        DateFormat dateFormatter = new SimpleDateFormat(DATE_PATTERN);
        String dateStr = dateFormatter.format(timeStamp);
        return MessageFormat.format(FILE, dateStr); 
}

有关日期格式的详细信息,您可以看到there和MessageFormat there

答案 2 :(得分:1)

TL;博士

"Report" + "_" 
         + Instant.now()                               // Capture the current moment in UTC.
                  .truncatedTo( ChronoUnit.SECONDS )   // Lop off the fractional second, as superfluous to our purpose.
                  .toString()                          // Generate a `String` with text representing the value of the moment in our `Instant` using standard ISO 8601 format: 2016-10-02T19:04:16Z
                  .replace( "-" , "" )                 // Shorten the text to the “Basic” version of the ISO 8601 standard format that minimizes the use of delimiters. First we drop the hyphens from the date portion
                  .replace( ":" , "" )                 // Returns 20161002T190416Z afte we drop the colons from the time portion. 
         + ".pdf"
  

Report_20161002T190416Z.pdf

或者为此目的定义格式化程序。单引号标记'表示“忽略这一段文本;期待文本,但不解释“。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "'Report_'uuuuMMdd'T'HHmmss'.pdf'" ) ;
String fileName = OffsetDateTime.now( ZoneOffset.UTC ).truncatedTo( ChronoUnit.SECONDS ).format( f )  ;

使用相同的格式化程序来解析回日期时间值。

OffsetDateTime odt = OffsetDateTime.parse( "Report_20161002T190416Z.pdf" , f ) ;

java.time

其他答案是正确但过时的。麻烦的旧遗留日期时间类现在被java.time类取代。

Instant获取当前时刻。 Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位数字)。

Instant instant = Instant.now();  // 2016-10-02T19:04:16.123456789Z

截断小数秒

您可能想要删除小数秒。

Instant instant = Instant.now().truncatedTo( ChronoUnit.SECONDS );

或者,如果您为了简单起见,如果不快速创建此类文件,您可能希望截断整分钟。

Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES );

您可以通过调用toString生成标准ISO 8601格式的字符串。

String output = instant.toString();
  

2016-10-02T19:04:16Z

坚持使用UTC

最后的ZZulu的缩写,表示UTC。作为程序员,有时候作为用户,你应该将UTC视为“一个真正的时间”,而不是“只是另一个时区”。您可以通过坚持使用UTC而不是任何特定时区来防止许多问题和错误。

结肠

HFS PlusMac OS X (macOS)iOSwatchOS以及包括达尔文支持在内的其他人使用的tvOS文件系统不允许使用这些冒号, Linux,Microsoft Windows。

使用ISO 8601标准格式

ISO 8601标准提供了“基本”版本,其中包含最少数量的分隔符以及上面看到的更常用的“扩展”格式。您可以通过简单地删除连字符和冒号将上面的字符串转换为“基本”版本。

String basic = instant.toString().replace( "-" , "" ).replace( ":" , "" );
  

20161002T190416Z

按照其他答案中的指示将该字符串插入您的文件名。

更优雅

如果您发现对String::replace笨拙的调用,您可以使用更优雅的方法来处理更多的java.time类。

Instant类是一个基本的构建块类,不适合花式格式化。为此,我们需要OffsetDateTime类。

Instant instant = Instant.now().truncatedTo( ChronoUnit.SECONDS );
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

现在为“基本”ISO 8601格式定义和缓存DateTimeFormatter

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuuMMdd'T'HHmmss" );

使用该formatter实例生成String。不再需要替换字符串中的字符。

String output = odt.format( formatter );

您也可以使用此格式化程序来解析此类字符串。

OffsetDateTime odt = OffsetDateTime.parse( "20161002T190416Z" , formatter );

分区

如果您决定使用特定区域的挂钟时间而不是UTC,请在ZoneId中应用时区以获取ZonedDateTime对象。与OffsetDateTime类似,但时区是偏离UTC 加上的一组规则,用于处理夏令时(DST)等异常。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

使用与上面相同的格式化程序,或根据自己的喜好进行自定义。

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于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