1

Play Frameworkはsince()、Play 1.xのビューで相対時間(「4分前」など)を取得する関数を使用しているようです(?)。これは、ここで日付延長として言及されています

ただし、Play 2.1では、これは機能しなくなったようです。私は...さらに、オンラインで(Play 2.1のコンテキストで)value since is not a member of java.util.Date他の参照を見つけることができません。since()

この一般的なケースを処理する適切な/デフォルトの方法はありますか?これはもうサポートされていないように見えるので、私は重要な何かを見逃しているに違いないと感じますか?

ありがとう!

4

3 に答える 3

2

since()2.0ブランチの開始以来、このメソッドは使用できません。

直接的な答えではありませんが、可能であれば、このタスクにJavaScriptプラグインを使用することをお勧めします。例:timeago jQueryプラグイン理由:

  • コントローラで計算する必要はありません
  • サイトを(たとえばメモリに)キャッシュすることができsince、クライアント側で更新されるため、時間は引き続き正しく表示されます。
  • ページを更新しなくても自動更新されます(ここのように、スタックオーバーフローで)
于 2013-02-25T17:40:43.160 に答える
1

私が知る限り、これはこれ以上行うことはできません(デフォルトではPlay2.1で)。私が間違っている場合は訂正してください。これが私がそれを再現した方法です。ここで述べたように、私は「日付」クラスを「刺激」しました。

//ファイルapp/views / pimps.scala

package views


package object pimps {

  import java.util.Date
  import org.joda.time.DateTime;
  import org.joda.time.Period;

  class PimpedDate(col: Date) {

    def since() = {
      def addS(b: Int) = if (b == 1) "" else "s"

      val now: DateTime = new DateTime();
      val period: Period = new Period(new DateTime(col), now);
      var r: String = "";

      if (period.getYears() > 0) {
        r = period.getYears() + " year" + addS(period.getYears()) + " ago";
      } else if (period.getWeeks() > 0) {
        r = period.getWeeks() + " week" + addS(period.getWeeks()) + " ago";
      } else if (period.getMonths() > 0) {
        r = period.getMonths() + " month" + addS(period.getMonths()) + " ago";
      } else if (period.getDays() > 0) {
        r = period.getDays() + " day" + addS(period.getDays()) + " ago";
      } else if (period.getHours() > 0) {
        r = period.getHours() + " hour" + addS(period.getHours()) + " ago";
      } else if (period.getMinutes() > 0) {
        r = period.getMinutes() + " minute" + addS(period.getMinutes()) + " ago";
      } else {
        r = period.getSeconds() + " second" + addS(period.getSeconds()) + " ago";
      }

      r
    }
  }

  implicit def pimpDate(col: Date) = new PimpedDate(col)
}

次に、私の見解では、上記をインポートすることができます。

@import views.pimps._

since()Play1と同じように使用します

<td>@record.created_on.since()</td>

これを行う、またはscalaコードを書くためのより良い方法がある場合は、コメント/回答してください...

于 2013-02-25T05:22:09.720 に答える
1

@ジャックはかなり良い答えを提案しました。

これは、必要に応じていくつかの構成を有効にするために役立つ可能性のある彼のコードのバージョンです(check関数は構成されていませんが、構成に簡単に変更して、値以降の詳細を表示できます)

package object pimps {

  import java.util.Date
  import org.joda.time.DateTime;
  import org.joda.time.Period;

  def step(f:Period => Int)(fi:String):Period => Option[String] = {
    def g(i:Int = 1) = i + " " + fi + (if (i==1) "" else "s") + " ago"

    (p:Period) => {
      f(p) match {
        case 0 => None
        case 1 => Some(g())
        case x => Some(g(x))
      }
    }
  }
  val yearsStep = step(_.getYears)("year")
  val monthsStep = step(_.getMonths)("month")
  val daysStep = step(_.getDays)("day")
  val hoursStep = step(_.getHours)("hour")
  val minutesStep = step(_.getMinutes)("minute")
  val secondsStep = step(_.getSeconds)("second")
  val steps = Seq(yearsStep, monthsStep, daysStep, hoursStep, minutesStep, secondsStep)

  val check = 
    (p:Period) =>
      steps.collectFirst {
        case f if f(p).isDefined => f(p).get
      }

  implicit class PimpedDate(col: Date) {

    def since() = {
      val period: Period = new Period(new DateTime(col), DateTime.now);
      check(period)
    }
  }
}

ご覧のとおり、今のところ、最初の一致レベルで停止し、ゲッターを繰り返します(一致が2回呼び出される場合はgetYears)。

それにもかかわらず、注意すべきもう1つの点はimplicit class、ポン引きを容易にするためにScala2.10で使用法が導入されていることです。

于 2013-02-25T11:59:50.200 に答える