[英]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);
}
"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類取代。
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
末端的Z
是Zulu
縮寫,表示UTC 。 始終作為程序員,有時作為用戶,您應該將UTC視為“一個真實時間”,而不是“僅另一個時區”。 堅持使用UTC而不是任何特定的時區,可以避免許多問題和錯誤。
Mac OS X(macOS) , iOS , watchOS , tvOS以及包括達爾文,Linux和Microsoft Windows支持的其他操作系統使用的HFS Plus文件系統中不允許使用這些冒號。
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 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的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中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.