2016-07-20 2 views
0

есть способ иметь DateTimeFormatter как этотDateTimeFormatter обнуления пустой

DateTimeFormatter.ofPattern("HH:mm") 

и он должен преобразовать в LocalDateTime и просто обнулить, Что не хватает?

На самом деле на Джоде был DateTimeFormat, который вернул DateTime, а не исключение. Есть ли что-то подобное?

val formatter = org.joda.time.format.DateTimeFormat.forPattern(pattern) 
formatter.parseDateTime(data).toDate 

всегда будет давать реальную дату, независимо от того, какой шаблон находится на java8, в нем говорится о его отсутствующем LocalDate.

На самом деле шаблон должен быть переменным, чтобы люди могли либо вставлять HH: mm и dd.MM.yyyy, и всегда получать LocalDateTime, которые должны быть инициализированы/дефолтны до 1970-01-01T00: 00.

Так делают:

// with pattern HH:mm 
formatter.parse("00:00") should yield LocalDateTime.of(1970, 01, 01, 0, 0) 

// with pattern YYYY-mm 
formatter.parse("2016-11") should yield LocalDateTime.of(2016, 11, 01, 0, 0) 
+0

В зависимости от того, что вы ищете. Вы ищете * исключительно * в течение нескольких часов или секунд, или вас интересует день, который постоянно установлен до полуночи? – Makoto

+0

можете ли вы разместить больше кодов? – haifzhan

+0

Не так много вентилятора из нескольких образцов; есть более умные способы справиться с такими вещами, в отличие от этого. Вы можете использовать 'LocalTime' для обработки времени и' LocalDate' для обработки аспекта даты. Естественно, шаблон даты должен иметь прикрепленный к нему день (если только вы не захотите принять первый месяц). – Makoto

ответ

2

Есть нет встроенных по умолчанию. Вы должны указать отсутствующие значения.

// Parse HH:mm 
LocalDateTime ldt1 = LocalTime.parse("12:34") 
           .atDate(LocalDate.of(1970, 1, 1)); 
System.out.println(ldt1); // Prints 1970-01-01T12:34 

// Parse YYYY-mm 
LocalDateTime ldt2 = YearMonth.parse("2016-11") 
           .atDay(1) 
           .atStartOfDay(); 
System.out.println(ldt2); // Prints 2016-11-01T00:00 

Обратите внимание, что вы даже не нужен DateTimeFormatter для любого из них.


UPDATE

Если вы должны использовать DateTimeFormatter, то вы можете создать его, используя DateTimeFormatterBuilder, где вы можете поставить недостающие значения, используя метод parseDefaulting().

// Parse HH:mm 
DateTimeFormatter formatter1 = new DateTimeFormatterBuilder() 
     .appendPattern("HH:mm") // other time fields default to 0, see "Resolving" 
     .parseDefaulting(ChronoField.EPOCH_DAY, 0) // short for 1970-01-01 
     .toFormatter(); 
LocalDateTime ldt1 = LocalDateTime.parse("12:34", formatter1); 
System.out.println(ldt1); // Prints 1970-01-01T12:34 

// Parse YYYY-mm 
DateTimeFormatter formatter2 = new DateTimeFormatterBuilder() 
     .appendPattern("uuuu-MM") 
     .parseDefaulting(ChronoField.DAY_OF_MONTH, 1) // see resolveDate() 
     .parseDefaulting(ChronoField.NANO_OF_DAY, 0) // short for 00:00:00.000000000 
     .toFormatter(); 
LocalDateTime ldt2 = LocalDateTime.parse("2016-11", formatter2); 
System.out.println(ldt2); // Prints 2016-11-01T00:00 

Что касается, какие поля необходимы для успешного синтаксического анализа, см:

+0

На самом деле я действительно хотел использовать переменные шаблоны. Так что, даже если ваш ответ правильный, на самом деле он не подходит для моего вопроса. –

0

Только в случае, если это решение работает для меня, но я сомневаюсь, что это не «общий» ответ, так как мне нужен только LocalDateTime и его также scala:

object MyDate { 
    def parse(text: CharSequence, formatter: DateTimeFormatter): MyDate = new MyDate(formatter.parse(text)) 
} 

class MyDate(accessor: TemporalAccessor) { 

    private[this] def getOrDefault(field: TemporalField, default: Int): Int = { 
    if (accessor.isSupported(field)) accessor.get(field) else default 
    } 

    def toLocalDateTime: LocalDateTime = { 
    val year: Int = getOrDefault(ChronoField.YEAR, 1970) 
    val month: Int = getOrDefault(ChronoField.MONTH_OF_YEAR, 1) 
    val day: Int = getOrDefault(ChronoField.DAY_OF_MONTH, 1) 
    val hour: Int = getOrDefault(ChronoField.HOUR_OF_DAY, 0) 
    val minute: Int = getOrDefault(ChronoField.MINUTE_OF_HOUR, 0) 

    LocalDateTime.of(year, month, day, hour, minute) 
    } 

} 
Смежные вопросы