11

この次のコードを機能させるために何時間も費やしました。

import org.joda.time.{DateTime, Period}


def dateRange(from: DateTime, to: DateTime, step: Period): Iterator[DateTime]      =Iterator.iterate(from)(_.plus(step)).takeWhile(!_.isAfter(to))

val range = {
dateRange(new DateTime(2012, 06, 30).minusYears(5), new DateTime(2000, 06, 30),new Period.months(6))
}

2000 年から 2012 年まで 6 か月単位でステップスルーする日付範囲配列を設定しようとしています。私が直面している問題は、次のエラーです。

Exception in thread "main" java.lang.IllegalArgumentException: No instant converter found for type: scala.Tuple3
at    org.joda.time.convert.ConverterManager.getInstantConverter(ConverterManager.java:165)
at org.joda.time.base.BaseDateTime.<init>(BaseDateTime.java:169)
at org.joda.time.DateTime.<init>(DateTime.java:241)
at tester.MomentumAlgo$class.$init$(MomentumAlgo.scala:154)
at tester.RunMomentumAlgo$$anon$1.<init>(RunMomentumAlgo.scala:86)
at tester.RunMomentumAlgo$.main(RunMomentumAlgo.scala:86)
at tester.RunMomentumAlgo.main(RunMomentumAlgo.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

最後の Period.months() 部分と関係があるようですが、修正方法がわかりません。Tuple3 エラーについてはわかりません。

誰かが私に別の解決策を与えることができれば、それも素晴らしいでしょう. 2000 年から 2012 年までの 6 か月ごとの日付のリストが必要です。

ご質問は大歓迎です。これは一般的なコードだと思っていましたが、ネット上にはあまり情報がありません。

前もって感謝します。

4

6 に答える 6

6

似たようなものが必要でした。これが私が思いついたものです:

import org.joda.time.{Period, DateTime}

class DateRange(val start: DateTime, val end: DateTime, val step: Period, inclusive: Boolean) extends Iterable[DateTime] {
    override def iterator: Iterator[DateTime] = new DateRangeIterator

    class DateRangeIterator extends Iterator[DateTime] {
        var current = start

        override def hasNext: Boolean = current.isBefore(end) || (inclusive && current == end)

        override def next(): DateTime = {
            val returnVal = current
            current = current.withPeriodAdded(step, 1)
            returnVal
        }
    }
}

使用例:

val startOfDay: DateTime = new DateTime().withTimeAtStartOfDay()
val endOfDay: DateTime = startOfDay.plusDays(1)
val dateRange = new DateRange(startOfDay, endOfDay, Period.hours(1), false)
for (d <- dateRange) println(d)

出力:

2015-03-16T00:00:00.000-05:00
2015-03-16T01:00:00.000-05:00
2015-03-16T02:00:00.000-05:00
2015-03-16T03:00:00.000-05:00
2015-03-16T04:00:00.000-05:00
2015-03-16T05:00:00.000-05:00
2015-03-16T06:00:00.000-05:00
2015-03-16T07:00:00.000-05:00
2015-03-16T08:00:00.000-05:00
2015-03-16T09:00:00.000-05:00
2015-03-16T10:00:00.000-05:00
2015-03-16T11:00:00.000-05:00
2015-03-16T12:00:00.000-05:00
2015-03-16T13:00:00.000-05:00
2015-03-16T14:00:00.000-05:00
2015-03-16T15:00:00.000-05:00
2015-03-16T16:00:00.000-05:00
2015-03-16T17:00:00.000-05:00
2015-03-16T18:00:00.000-05:00
2015-03-16T19:00:00.000-05:00
2015-03-16T20:00:00.000-05:00
2015-03-16T21:00:00.000-05:00
2015-03-16T22:00:00.000-05:00
2015-03-16T23:00:00.000-05:00
于 2015-03-16T15:47:54.393 に答える
5

OK、これが完全な作業コードです。

import org.joda.time.{Period, DateTime}

object runme {

  def main(args:Array[String]) {

  def dateRange(from: DateTime, to: DateTime, step: Period): Iterator[DateTime]
  =Iterator.iterate(from)(_.plus(step)).takeWhile(!_.isAfter(to))

  val range = { dateRange(new DateTime(2000, 06, 30,0,0,0,0).minusYears(5) ,new DateTime(2013, 06, 30,0,0,0,0),new Period(0,6,0,0,0,0,0,0))}

  range.foreach(u => { 
    print(u.getYear)
    print(u.getMonthOfYear)
    println(u.getDayOfMonth)
  })

 }
}

私の主な問題は、DateTime()関数の後に十分な数値 (ミリ秒など) がなかったことだと思います。これは、コンパイラが必要なすべてのパラメーターを受け取っていないことを意味していました。アレクセイ・ロマノフが述べたように

これにより、目的の範囲の日付が出力され、反復子として使用できます。

他の人に役立つことを願っています。

助けてくれた@Brianと他の人に感謝

于 2013-07-17T23:07:48.790 に答える
5

DateTime intには 3 つの引数を取るコンストラクタがないため、タプルを引数としてコンストラクタをnew DateTime(2012, 06, 30)呼び出します。ドキュメントには次のように記載されています。DateTime(Object)(2012, 06, 30)

Object日時を表すからインスタンスを構築します。

オブジェクトが年表を暗示している場合 (そうであるようにGregorianCalendar)、その年表が使用されます。それ以外の場合は、ISO デフォルトが使用されます。したがって、aGregorianCalendarが渡された場合、使用される年表は GJ になりますが、日付が渡された場合、年表は ISO になります。

認識されるオブジェクト タイプは、 、、ConverterManagerおよびで定義されています。フォーマットは で説明されています。ReadableInstantStringCalendarDateStringISODateTimeFormat.dateTimeParser()

当然のことながら、ConverterManager例外が発生する Scala タプルをどう処理すればよいかわかりません。

誰かが私に別の解決策を与えることができれば、それも素晴らしいでしょう. 2000 年から 2012 年までの 6 か月ごとの日付のリストが必要です。

実際に日付が必要な場合は、より適切な型を使用するLocalDateことをお勧めします (ちなみに、これには必要なコンストラクターがあります)。これらの日付の開始時に必要な場合DateTimeは、どのタイム ゾーンを使用するかを検討する必要があります。

于 2013-07-17T06:13:48.080 に答える