用Java命名一个文件,以包含日期和时间戳



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

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

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

br

"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 h1> 他答案是正确的,但过时了。麻烦的旧的遗留日期时间类现在被java取代了。时间类。

获取当前时刻为InstantInstant类表示UTC时间轴上的时刻,分辨率为纳秒(最多九(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 - 02 t19:04:16z

坚持使用UTC

后面的ZZulu的缩写,表示UTC。作为一个程序员,有时作为一个用户,你应该把UTC看作是"一个真正的时间",而不是"另一个时区"。你可以通过坚持使用UTC而不是任何特定的时区来避免许多问题和错误。

<标题>冒号h1> 些冒号不允许在Mac OS X (macOS), iOS, watchOS, tvOS和其他包括Darwin, Linux, Microsoft Windows支持的HFS Plus文件系统中使用。

使用ISO 8601标准格式

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

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

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

<标题>更优雅h1> 果您发现对String::replace的调用很笨拙,您可以使用更优雅的方法和更多的java。时间类。

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" );

使用格式化程序实例生成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及以后版本中。这些类取代了麻烦的旧的遗留日期时间类,如java.util.Date, Calendar, &SimpleDateFormat .

Joda-Time项目,现在处于维护模式,建议迁移到java。时间类。

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获得许多示例和解释。规格为JSR 310。

可以交换java。Time 直接与数据库关联。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要java.sql.*类。

从哪里获取java。时间类?

  • Java SE 8Java SE 9Java SE 10Java SE 11,以及更高版本-标准Java API的一部分,捆绑实现。
    • Java 9增加了一些小的特性和修复。
  • Java SE 6Java SE 7
    • 大多数java。time功能向后移植到Java 6;7在 ThreeTen-Backport
  • Android
    • Android bundle实现的更高版本的java。时间类。
    • 对于早期的Android (<26), ThreeTenABP项目适应ThreeTen-Backport(如上所述)。参见如何使用ThreeTenABP…
  • ThreeTen-Extra项目扩展了java。有额外课程的时间。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等。

    使用SimpleDateFormat和split来保持文件扩展名:

    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"
    

    更新:
    如果你能够修改FILE变量,我的建议是:

    private static String FILE_PATH = "D:Report";
    private static String FILE_EXTENSION = ".pdf";
    DateFormat df = new SimpleDateFormat("yyyyMMddhhmmss"); // add S if you need milliseconds
    String filename = FILE_PATH + df.format(new Date()) + "." + FILE_EXTENSION;
    // filename = "D:Report20150915152301.pdf"
    

    你可以这样做

    定义你的文件名模式如下:

    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); 
    }
    

    关于日期格式的更多信息,你可以看到那里的MessageFormat

    相关内容

    • 没有找到相关文章

    最新更新