2016-06-08 86 views
1

因此,我正在開發一個工作項目,我分配的一項任務是創建一個按鈕,當它按下時,會創建一個.txt文件文件與當前日期和時間的名稱。我知道如何創建一個.txt文件,並知道如何獲取當前日期。但是,當我嘗試使用日期名稱創建新文件時,它會創建IOException。這裏是我的代碼:如何使用當前日期的名稱創建一個新的文件

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
Date date = new Date(); 
String dateTxt = dateFormat.format(date) + ".txt"; 
PrintWriter writer = new PrintWriter(dateTxt, "UTF-8"); 

IOException拋出那裏。但是,如果我用諸如「placeHolder.txt」之類的東西替換dateTxt,它可以正常工作並創建一個新文件。所以我不明白爲什麼它不適用於String dateTxt。請幫忙。

+0

請張貼例外。 –

+0

java.io.IOException:沒有這樣的文件或目錄 –

+0

@DannySeaton更好地發佈額外的信息作爲編輯的問題,而不是作爲評論。 –

回答

1

你可能想你的SimpleDateFormat改變一些東西,輸出一個有效的文件名:

DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); 
3

:/是您在創建文件時可能想要轉義的特殊字符。轉義這些應該允許你創建文件。

+0

哇我是這樣一個白癡非常感謝你 –

+0

Windows不允許文件名包含任何'\ /:*? 「< > |',所以逃避這些角色是不夠的,你必須用別的東西替換它們。 – JonK

1

Answer by Venkat是正確的,因爲是Answer by nvuono。但讓我們看看兩個問題:現代日期時間類和時區處理。

TL;博士

對於UTC ...

String now = Instant.now().truncatedTo(ChronoUnit.SECONDS).toString().replace("-" , "").replace(":" , ""); 

20160608T234748Z

對於本地時區(但留下曖昧省略偏移或時區)...

String now = LocalDateTime.now(ZoneId.of("America/Montreal")).truncatedTo(ChronoUnit.SECONDS).toString().replace("-" , "").replace(":" , ""); 

20160608T194748

對於包括本地時區偏移從-UTC ...

String now = OffsetDateTime.now(ZoneId.of("America/Montreal")).truncatedTo(ChronoUnit.SECONDS).toString().replace("-" , "").replace(":" , ""); 

20160608T194748-0700

詳細信息中顯示

的類問題和其他答案過時了。與最早版本的Java捆綁在一起的麻煩的舊日期時間類在Java 8中取代,後來由java.time框架取代。這些功能中的大部分都被移植到了ThreeTen-Backport中的Java 6中,並進一步適用於ThreeTenABP中的Android。

此外,時區未解決。

如果您希望使用UTC的當前時間,請使用Instant

Instant instant = Instant.now(); 

你想整秒,所以我們通過截斷整秒來設置小數秒。

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

的java.time類解析/生成表示日期時間值字符串時默認使用標準ISO 8601格式。該標準是按年份月份日期 - 小時 - 分鐘 - 秒的順序排列,按字母順序排序時會產生時間順序。

String output = instant.toString(); // 2016-06-08T23:47:48Z 

示例輸出:2016-06-08T23:47:48Z。因此需要替換各種操作系統上不同文件系統所允許的字符。 JonK的評論列出了其中的一些。正如nvuono所建議的,一種方法是消除所有標點符號。這種分隔符的最小化在ISO 8601中被稱爲基本版本,其中標準使用T將年 - 月 - 日與小時 - 分鐘 - 秒分開。

達到該基本格式的一種方法是刪除插入完整版本的標點符號。

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

如果您願意,可以添加.replace("T" , "_")。不使用複雜字體時,T可能會使值更難讀取。有些人根本不使用分隔符,但是這使得難以辨別我的價值。

我建議你保留Z,簡稱Zulu這意味着UTC。日期時間的含義是不明確的,沒有指示時區。

或定義您自己的格式模式。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddTHHmmssX"); // Or "yyyyMMdd_HHmmssX". 

使用X代碼在結束Z追加如果與UTC工作。

Instant類是java.time中的基本構建塊,不適用于格式化。轉換爲OffsetDateTime以使用格式化程序。指定你想要的offset-from-UTC;這裏我通過常數ZoneOffset.UTC使用UTC本身。

OffsetDateTime odt = OffsetDateTime.ofInstant(instant , ZoneOffset.UTC); 

或者,使用簡便方法now捕捉到當前時刻而無需通過Instant去。請記住放棄秒數。

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

OffsetDateTime是當你只是一個offset但不是一個完整的time zone。時區是一個偏移量一組處理異常的規則,如Daylight Saving Time (DST)。如果您更喜歡在某些地區使用wall-clock time,請通過應用ZoneId來調整爲時區,以獲得ZonedDateTime

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = ZonedDateTime.now(zoneId).truncatedTo(ChronoUnit.SECONDS); 

toString的方法上ZonedDateTime既包括偏移從-UTC(ISO 8601標準的一部分),並且還附加在方括號中的時區的名稱(一個好主意,但不是標準)。如果您確實不想包含時區信息,請使用上面所示的DateTimeFormatter。或者使用故意丟失所有時區信息的LocalDateTime

ZoneId zoneId = ZoneId.of("America/Montreal"); 
LocalDateTime ldt = LocalDateTime.now(zoneId).truncatedTo(ChronoUnit.SECONDS); 

刪除有問題的字符:

String output = ldt.toString().replace("-" , "").replace(":" , ""); 
相關問題