С Noda Time, как создать LocalDateTime, используя LocalDate и LocalTime

У меня есть LocalDate и LocalTime, и я хотел бы просто создать из них структуру LocalDateTime. Я подумал о следующем методе расширения, который, как мне кажется, будет самым быстрым, но по непонятной причине поле localTime.TickOfMillisecond не существует в текущей версии API. Так что это не работает.

    public static LocalDateTime At(this LocalDate localDate, LocalTime localTime) {
        return new LocalDateTime(localDate.Year, localDate.Month, localDate.Day, localTime.Hour, localTime.Minute, localTime.Second, localTime.Millisecond, localTime.TickOfMillisecond);
    }

Итак, я застрял в среднем времени, чтобы использовать:

    public static LocalDateTime At(this LocalDate localDate, LocalTime localTime) {
        return localDate.AtMidnight().PlusTicks(localTime.TickOfDay);
    }

Любые советы приветствуются.


person Erwin Mayer    schedule 06.02.2013    source источник


Ответы (3)


Это намного проще, чем то, что у вас есть сейчас — просто используйте + оператор:

LocalDate date = ...;
LocalTime time = ...;
LocalDateTime dateTime = date + time;
person Jon Skeet    schedule 11.02.2013
comment
Большой! Спасибо. В целях обнаружения, возможно, стоит включить эквивалентный метод (тем более, что есть другие для аналогичных задач). - person Erwin Mayer; 11.02.2013
comment
@ErwinMayer: Действительно. Я подумаю об этом... Я не уверен, что это должно быть симметрично: LocalDate.At(LocalTime) и LocalTime.On(LocalDate)? AtTime и OnDate вместо At и On? Будет обдумывать. - person Jon Skeet; 11.02.2013
comment
Я бы предпочел LocalDate.At(LocalTime), если необходимо выбрать одну из симметричных альтернатив, поскольку она следует иерархии времени, используемой в другом месте (год, месяц, день, час, минута, секунды...). Однако для удобочитаемости кода LocalTime.On(LocalDate) также имеет смысл, и его было бы неплохо иметь в случаях использования, когда основной информацией является время (по сравнению с датой). - person Erwin Mayer; 11.02.2013
comment
JSR-310 использует localDate.atTime(localTime) - person JodaStephen; 12.03.2013
comment
@JodaStephen: Спасибо за это. У вас есть эквивалент для LocalTime.onDate(LocalDate)? Я не уверен, что необходимо быть симметричным везде, но... - person Jon Skeet; 12.03.2013
comment
localTime.atDate(localDate). Это всегда atXxx(). См. threeten.github.com/threetenbp/apidocs. - person JodaStephen; 13.03.2013
comment
Кажется, что оператор + не определен таким образом для Joda Time. Есть ли простой способ сделать то же самое с помощью Joda Time? В данный момент я использую localDateTime = new LocalDateTime().withFields(localDate).withFields(localTime); - person FGreg; 03.05.2013
comment
@FGreg: используйте LocalDate.toLocalDateTime(LocalTime). - person Jon Skeet; 03.05.2013
comment
LocalDateDate.FromLocalDateAndLocalTime(LocalDate, LocalTime) будет еще одним вариантом. Также похож на весь другой вид методов FromXyz(). - person Stepan Stulov; 15.07.2019

Существует метод объединения LocalDate и LocalTime для формирования LocalDateTime.

LocalDate date = ...;
LocalTime time = ...;
LocalDateTime dateTime=date.atTime(time);
person Mahesh Kshirsagar    schedule 18.02.2016
comment
Где вы видите такой метод? Кажется, вы используете java вместо .NET. - person Erwin Mayer; 18.02.2016
comment
Да В Java 8 этот метод доступен, не уверен в другой версии - person Mahesh Kshirsagar; 12.01.2017

Ну, я не уверен, почему этого нет в API. Может быть, Джон Скит сможет ответить на этот вопрос.

Я не вижу ничего плохого в том, как вы это сделали во втором примере, но вы можете рассчитать tickOfMillisecond следующим образом:

public static LocalDateTime At(this LocalDate localDate, LocalTime localTime)
{
    var tickOfMillisecond = localTime.TickOfSecond - localTime.Millisecond * 10000;
    return new LocalDateTime(localDate.Year, localDate.Month, localDate.Day, localTime.Hour, localTime.Minute, localTime.Second, localTime.Millisecond, tickOfMillisecond);
}

Лично я считаю, что должен быть конструктор для LocalDateTime, чтобы вы могли сделать это вместо этого:

var ldt = new LocalDateTime(localDate, localTime);

Еще одна вещь - возможно, ваш метод расширения должен проверять, что дата и время находятся в одной и той же календарной системе, а затем передавать это результату? Я никогда не пользовался каким-либо календарем, кроме ISO, поэтому не уверен в этом.

person Matt Johnson-Pint    schedule 08.02.2013
comment
Спасибо за совет. Знаете ли вы, что TickOfMillisecond отсутствует намеренно или просто каким-то образом забыт в текущей версии? Я не вижу свойства календаря в LocalTime... - person Erwin Mayer; 09.02.2013
comment
Я действительно не знаю. Извини. - person Matt Johnson-Pint; 10.02.2013
comment
@ErwinMayer: Вся разница между TickOfMillisecond и TickOfSecond, если честно, немного раздражает. TickOfSecond в целом более разумное значение... но, к счастью, в любом случае есть лучший способ сделать то, что вы хотите, согласно моему ответу :) - person Jon Skeet; 11.02.2013