java SimpleDateFormat returns 部分时间 windows

java SimpleDateFormat returns a part of the time on windows

我正在尝试获取当前时间并将其附加到我生成的文件的名称中。

代码段:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern(app.values.getProperty("yyyy-MM-dd"));
LocalDateTime now = LocalDateTime.now();
String date = dtf.format(now);
Date today = Calendar.getInstance().getTime();
SimpleDateFormat timeFormat = new SimpleDateFormat("hh:mm");
String time = timeFormat.format(today);
FileOutputStream fs = new FileOutputStream("receipt/Receipt_" + date + "_"+time+".pdf");

这在 linux 上工作正常(returns "Receipt_2018-04-18_11:13" 作为文件名)但是当我 运行 windows 7 上的 jar 时,它只给出

Receipt_2018-04-18_11

并且生成的文件已损坏且为空。我该如何解决这个问题?

SimpleDateFormat timeFormat = new SimpleDateFormat("hh:mm");
String time = timeFormat.format(today);
FileOutputStream fs = new FileOutputStream("receipt/Receipt_" + date + "_"+time+".pdf");

: 是一个非法文件字符(至少在 Windows 下,可能是其他字符)。

有关详细信息,请查看 Naming Files, Paths, and Namespaces,其中包含无效的 file/directory 名称字符列表

也许可以改成-,例如

SimpleDateFormat timeFormat = new SimpleDateFormat("hh-mm");
String time = timeFormat.format(today);
FileOutputStream fs = new FileOutputStream("receipt/Receipt_" + date + "_"+time+".pdf");

或改用SimpleDateFormat timeFormat = new SimpleDateFormat("hhmm");

更新

显然,对于某些人来说,解决眼前的问题是不够的。

java.util.Date 类 通常被认为已弃用,您应该改用更新的(和改进的)java.time API,例如...

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_hh-mm");
FileOutputStream fs = new FileOutputStream("receipt/Receipt_" + formatter.format(LocalDateTime.now()) + ".pdf");

或者,如果你不能(使用 Java 8+),许多可用库之一,包括 java.time

的后向端口

问题是“:”是 Windows OS 上文件名的不正确字符,因此需要替换它。基本上你的代码太多了,你不需要 Calendar 因为 LocalDateTime 已经有时间戳部分。

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd_hh_mm");
LocalDateTime now = LocalDateTime.now();
String dateTime = dtf.format(now);
FileOutputStream fs = new FileOutputStream("receipt/Receipt_" + dateTime + ".pdf");

希望对您有所帮助!

试试这个,我认为它对你有用

对于java.util.Date,只需创建一个新的 Date()

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");    Date date = new Date();     System.out.println(dateFormat.format(date));