1

似乎 Play 框架使用(?)具有since()在 Play 1.x 的视图中获取相对时间(如“4 分钟前”)的功能。这在此处被称为日期扩展

但是在 Play 2.1 中,这似乎不再起作用。我明白value since is not a member of java.util.Date了......此外,我在网上找不到任何其他参考since()(在 Play 2.1 的上下文中)。

是否有处理这种常见情况的正确/默认方式?我觉得我必须错过一些重要的东西,因为这似乎不再受支持?

谢谢!

4

3 回答 3

2

自 2.0 分支开始以来,该since()方法不可用。

不是直接的答案,但如果可能的话,我建议为此任务使用 JavaScript 插件,例如:timeago jQuery 插件原因:

  • 它不需要在控制器中计算它
  • 您可以长时间缓存您的站点(例如在内存中),并且since在客户端更新时间时仍会正确显示时间。
  • 即使没有页面刷新它也会自动更新(就像这里,在 Stack Overflow 上)
于 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

@Jack 提出了一个很好的答案。

这是他的代码的一个版本,可能很有用,因为它可以在需要时启用一些组合(该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)
    }
  }
}

如您所见,现在我们停在第一个匹配级别,并且我们重复 getter(如果匹配将被调用两次,则为 getYears)。

然而,另一件需要注意的事情是implicit class在 Scala 2.10 中引入了使用它来缓解拉皮条

于 2013-02-25T11:59:50.200 回答