簡體   English   中英

用Java命名文件以包括日期和時間戳

[英]Name a file in Java to include date and time stamp

我正在使用NetBeans將數據導出到Java應用程序中的文件中。 該文件將具有我在代碼中給定的硬編碼名稱。 請在下面的代碼中找到。

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

我想在生成的文件名上附加日期和時間戳,以便創建的每個文件都是唯一的文件。 如何實現呢?

使用SimpleDateFormat並拆分以保持文件擴展名:

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中

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表示時間軸上的時刻,分辨率為納秒 (最多十進制的九(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而不是任何特定的時區,可以避免許多問題和錯誤。

冒號

Mac OS X(macOS)iOSwatchOStvOS以及包括達爾文,Linux和Microsoft Windows支持的其他操作系統使用的HFS Plus文件系統中不允許使用這些冒號。

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

使用該格式化程序實例生成一個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.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310

您可以直接與數據庫交換java.time對象。 使用與JDBC 4.2或更高版本兼容的JDBC驅動程序 不需要字符串,不需要java.sql.*類。

在哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM