【问题标题】:Relative time for views in Play Framework 2.1Play Framework 2.1 中视图的相对时间
【发布时间】:2013-02-10 02:37:50
【问题描述】:

似乎 Play 框架使用(?)有一个 since() 函数来获取 Play 1.x 视图中的相对时间(如“4 分钟前”)。这被称为日期扩展here

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

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

谢谢!

【问题讨论】:

    标签: java scala playframework playframework-2.0


    【解决方案1】:

    since() 方法自 2.0 分支开始后不可用。

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

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

    【讨论】:

    • 不错的客户端替代方案。确实,与长期存在的页面非常相关
    【解决方案2】:

    @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 中引入以缓解拉皮条

    【讨论】:

    • 谢谢。我知道必须有更好的方法来编写 scala。
    • 还不完善,但我尝试分解代码,只是为了方便地启用不同的重组。
    【解决方案3】:

    据我所知,这是不可能的(默认情况下在 Play2.1 中)。如果我错了,请纠正我。这是我重新创建它的方法。正如here 提到的,我“拉皮条”了“日期”类:

    // 文件 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._
    

    然后像在 Play1 中一样使用since()

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

    如果有更好的方法或编写 scala 代码,请评论/回答...

    【讨论】:

    • 您是混淆了几周和几个月还是我误解了?
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多