вычитание DateTime из DateTime в Scala - PullRequest
6 голосов
/ 25 ноября 2010

Я относительно новичок как в скале, так и в йодатиме, но был впечатлен обоими. Я пытаюсь выяснить, есть ли более элегантный способ сделать некоторую арифметику дат. Вот метод:


private def calcDuration() : String = {
  val p = new Period(calcCloseTime.toInstant.getMillis - calcOpenTime.toInstant.getMillis)
  val s : String = p.getHours.toString + ":" + p.getMinutes.toString + 
      ":" + p.getSeconds.toString
  return s
}

Я конвертирую все в строку, потому что я помещаю это в MongoDB, и я не уверен, как сериализовать Joda Duration или Period. Если кто-то знает, я был бы очень признателен за ответ.

В любом случае методы calcCloseTime и calcOpenTime возвращают объекты DateTime. Конвертировать их в Instants - лучший способ найти разницу. Есть ли лучший способ?

Еще один побочный вопрос: если часы, минуты или секунды представляют собой одну цифру, результирующая строка не заполняется нулями. Есть ли простой способ сделать эту строку похожей на ЧЧ: ММ: СС?

Спасибо, John

Ответы [ 3 ]

8 голосов
/ 25 ноября 2010

Period форматирование выполняется классом PeriodFormatter . Вы можете использовать по умолчанию или создать свой собственный, используя PeriodFormatterBuilder . Для правильной настройки этого компоновщика может потребоваться еще немного кода, но вы можете использовать его, например, так:


scala> import org.joda.time._
import org.joda.time._

scala> import org.joda.time.format._
import org.joda.time.format._

scala> val d1 = new DateTime(2010,1,1,10,5,1,0)
d1: org.joda.time.DateTime = 2010-01-01T10:05:01.000+01:00

scala> val d2 = new DateTime(2010,1,1,13,7,2,0)
d2: org.joda.time.DateTime = 2010-01-01T13:07:02.000+01:00

scala> val p = new Period(d1, d2)
p: org.joda.time.Period = PT3H2M1S

scala> val hms = new PeriodFormatterBuilder() minimumPrintedDigits(2) printZeroAlways() appendHours() appendSeparator(":") appendMinutes() appendSuffix(":") appendSeconds() toFormatter
hms: org.joda.time.format.PeriodFormatter = org.joda.time.format.PeriodFormatter@4d2125

scala> hms print p
res0: java.lang.String = 03:02:01

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


scala> val p2 = new Period(new LocalDate(2010,1,1), new LocalDate(2010,1,2))
p2: org.joda.time.Period = P1D

scala> hms print p2                                                         
res1: java.lang.String = 00:00:00

так что, если вам нужно обрабатывать их, вам также нужно добавить необходимые поля (дни, недели, годы) в форматтер.

7 голосов
/ 25 ноября 2010

Возможно, вы захотите взглянуть на упаковку Хорхе Ортиса для Joda-Time, scala-time для чего-то более приятного для работы в Scala.

Тогда вам следуетвозможность использовать что-то вроде

(calcOpenTime to calcCloseTime).millis
1 голос
/ 25 ноября 2010

Помогает ли эта ссылка ?

Как рассчитать разницу между двумя датами?

На этот вопрос более одного ответа!Если вам просто нужно количество целых дней между двумя датами, вы можете использовать новый класс Days в версии 1.4 Joda-Time.

Days d = Days.daysBetween(startDate, endDate);
int days = d.getDays();

Этот метод и другие статические методы класса Days имеютбыл разработан, чтобы хорошо работать со статическим средством импорта JDK5.

Если, однако, вы хотите рассчитать количество дней, недель, месяцев и лет между двумя датами, то вам нужен период. По умолчанию это разделитразница между двумя датами и частями, например, «1 месяц, 2 недели, 4 дня и 7 часов».

Period p = new Period(startDate, endDate);

Вы можете контролировать, какие поля извлекаются, используя PeriodType.

Period p = new Period(startDate, endDate, PeriodType.yearMonthDay());

Этот пример вернет не возвращая ни недели, ни поля времени, поэтому предыдущий пример станет "1 месяц и 18 дней".

...