2016-07-20 7 views
0

をゼロにそのてDateTimeFormatterは空

DateTimeFormatter.ofPattern("HH:mm") 

のようにしてDateTimeFormatterを持っているし、それがLocalDateTimeをに変換し、ちょうどゼロ欠けていただきましアウトすべき方法はありますか?

実際にはJodaにDateTimeを返すDateTimeFormatがありましたが、例外はありません。それに相当するものはありますか?

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'を使って日付の様子を扱うことができます。当然のことながら、日付パターンには1日が付いていなければなりません(あなたが常にその月の最初の日を想定しない限り)。 – 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を使用する必要がある場合、その後、あなたはparseDefaulting()メソッドを使用して欠損値を供給することができDateTimeFormatterBuilderを使用して作成することができます。

// 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とそのスカラーだけを必要として以来の「一般的な」答え:

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) 
    } 

} 
関連する問題