Java SimpleDateFormat возвращает часть времени на окнах

Я пытаюсь узнать текущее время и добавить его к имени файла, который я генерирую.

фрагмент кода:

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 (возвращает "Receipt_2018-04-18_11:13" для имени файла), но когда я запускаю JAR на Windows 7, он только дает

Receipt_2018-04-18_11

и сгенерированный файл поврежден и пуст. Как я могу это исправить?

3 ответа

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

: является недопустимым символом файла (по крайней мере, под Windows, возможно, другими).

Для получения дополнительной информации ознакомьтесь с именами файлов, путей и пространств имен, он содержит список недопустимых символов имени файла / каталога

Может быть, изменить его на -, например

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, поэтому его необходимо заменить. В основном ваш код чрезмерен, вам не нужно 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, просто создайте новую дату ()

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");    Date date = new Date();     System.out.println(dateFormat.format(date));
Другие вопросы по тегам