2015-07-15 1 views
6

Я хочу заменить JodaTime на Java 8 DateTime API.Parse ISO date by Период в Java 8

У меня ISO-8601 период, охарактеризованный = P2W5DT11H8M

В JodaTime я разобрать его очень просто, выполнив следующий код:

Period.parse("P2W5DT11H8M") и я получаю успешный Period объект.

Могу ли я сделать то же самое в Java 8?

+0

И каково ваше намерение в отношении результата? Планируете ли вы добавить период в «LocalDateTime»? Если это так, то алгоритм сложения, неявно предложенный ответом Assylias (отдельные добавления в два этапа), не совсем то, что определяет Joda-Time и может давать разные результаты в некоторых случаях с краем. Кроме того, в Java-8 нет возможностей форматирования для периодов/продолжительности, чтобы вы могли подумать о своем решении. –

+1

@MenoHochschild Я хочу иметь тот же период, что и в JodaTime. В настоящее время я вижу, что я теряю данные, например, я не могу использовать минуты, вместо этого я должен использовать дополнительную реализацию из Java 8 - класса Duration. – ServerSideCat

ответ

-4

Короткий ответ:

Period period = Period.parse("P2W5DT11H8M"); 

Длинный ответ: Существует хорошее описание, Oracle на when to use Period or Duration. Он поставляется с некоторыми хорошими образцами кода и должен отвечать на любые последующие вопросы, которые могут возникнуть у вас.

+3

Это вызовет исключение во время выполнения. – assylias

5

A Период на Java 8 содержит только компоненты года/месяца/дня. A Продолжительность имеет компоненты час/минута/секунда. Кажется, что вам нужно будет разобрать строку вручную. Один из вариантов может выглядеть как код ниже (вам нужно добавить подтверждение ввода и т. Д.) - могут быть лучшие альтернативы.

public static void main(String[] args) { 
    System.out.println(PeriodAndDuration.parse("P2W5DT11H8M")); 
} 

public static class PeriodAndDuration { 
    private final Period p; 
    private final Duration d; 

    public PeriodAndDuration(Period p, Duration d) { 
    this.p = p; 
    this.d = d; 
    } 

    public Period getPeriod() { 
    return p; 
    } 

    public Duration getDuration() { 
    return d; 
    } 

    public static PeriodAndDuration parse(String input) { 
    int periodStart = input.indexOf("P"); 
    int timeStart = input.indexOf("T"); 
    Period p = Period.parse(input.substring(periodStart, timeStart)); 
    Duration d = Duration.parse("P" + input.substring(timeStart, input.length())); 
    return new PeriodAndDuration(p, d); 
    } 

    @Override 
    public String toString() { 
    return p.toString() + d.toString(); 
    } 
} 
+0

Спасибо за ответ. Итак, насколько я понимаю, разбор такой полной строки я должен нести ответственность и думать, что могу анализировать только год/месяц/день. – ServerSideCat

+1

Насколько я знаю - кто-то другой может придумать лучший ответ. – assylias