2016-12-23 5 views
0

Есть ли способ использовать следующую SimpleDateFormat:SimpleDateFormat устанавливает текущий день для анализируемой даты

final SimpleDateFormat simpleDateFormatHour = new SimpleDateFormat("HH:mm:ss z"); 

и при вызове:

simpleDateFormat.parse("12:32:21 JST"); 

вернуть текущую дату на объекте Date?

Для этих, например, он будет возвращать:

Thu Jan 01 05:32:21 EET 1970 

и нет:

<<today>> 05:32:21 EET <<currentYear>> 

как мне нужно.

+1

'SimpleDateFormat' не поддерживает даты по умолчанию, или другими словами: 1970-01-01 единственная неподвижная по умолчанию дата для этого форматирования. Если вы хотите больше гибкости, вы можете использовать 'DateTimeFormatter' в Java-8. –

ответ

2

Нет, SimpleDateFormat Требуется повторная идентификация даты во входной строке. Если вы используете Java 8, вы можете пойти с LocalDateTime:

LocalDateTime localDateTime = LocalDate.now().atTime(5, 32, 21); 

Если вы хотите включить часовой пояс, вы можете использовать ZonedDateTime.

0

Construct другой SimpleDateFormat печатать текущую дату:

String today = new SimpleDateFormat("yyyy/MM/dd").print(new Date()); 

(будьте осторожны: вы можете установить часовой пояс на SimpleDateFormat, как «сегодня» отличается в разных часовых поясах).

Обновить формат даты включать год, месяц и день:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss z"); 

А затем предварять строку даты с датой вы хотите:

simpleDateFormat.parse(today + " " + "12:32:21 JST"); 
1

Лучшее решение с использованием гибких значений по умолчанию (сегодня вместо 1970-01-01) будет в Java-8 с новой встроенной библиотекой времени-времени, расположенной в пакете java.time:

String input = "12:32:21 JST"; 
String pattern = "HH:mm:ss z"; 

LocalDate today = LocalDate.now(ZoneId.of("Asia/Tokyo")); 
DateTimeFormatter dtf = 
    new DateTimeFormatterBuilder().parseDefaulting(ChronoField.YEAR, today.getYear()) 
    .parseDefaulting(ChronoField.MONTH_OF_YEAR, today.getMonthValue()).parseDefaulting(
     ChronoField.DAY_OF_MONTH, 
     today.getDayOfMonth() 
    ).appendPattern(pattern).toFormatter(Locale.ENGLISH); 
ZonedDateTime zdt = ZonedDateTime.parse(input, dtf); 
System.out.println(zdt); // 2016-12-23T12:32:21+09:00[Asia/Tokyo] 

Тем не менее, я по-прежнему вижу небольшую ошибку, связанную с тем, что этот код делает обоснованное предположение о используемой зоне перед разбором реальной зоны, поэтому обращайтесь с осторожностью. Имейте в виду, что текущая дата зависит от зоны. Но, возможно, вам нужно всего лишь обработать сценарий, когда пользователи используют только японское время.

Подсказка: вы также можете разобрать в два этапа. Первый шаг с любой фиксированной датой по умолчанию, чтобы получить информацию о зоне текста, подлежащего анализу. И тогда вы можете использовать эту информацию о зоне для предлагаемого решения выше. Неловкая, но безопасная процедура.

0

Вы можете использовать этот код, если вы хотите изменить только год и день

final SimpleDateFormat simpleDateFormatHour = new SimpleDateFormat("HH:mm:ss z"); 
Date date = simpleDateFormatHour.parse("12:32:21 JST"); 
Calendar calendar = Calendar.getInstance(); 
calendar.setTime(date); 
calendar.set(Calendar.YEAR, Calendar.getInstance().get(Calendar.YEAR)); 
calendar.set(Calendar.DAY_OF_YEAR, Calendar.getInstance().get(Calendar.DAY_OF_YEAR)); 
date = calendar.getTime();