【问题标题】:Scala Operation on TimeStamp values对时间戳值的 Scala 操作
【发布时间】:2018-03-02 15:39:15
【问题描述】:

我在时间戳中有输入,根据某些条件,我需要使用 scala 编程减 1 秒或减 3 个月

输入:

val date :String = "2017-10-31T23:59:59.000"

输出:

减 1 秒

val lessOneSec = "2017-10-31T23:59:58.000"

减去 3 个月

val less3Mon   = "2017-07-31T23:59:58.000"

如何将字符串值转换为时间戳,并在scala编程中进行减号等操作?

【问题讨论】:

    标签: scala apache-spark spark-dataframe


    【解决方案1】:

    我假设你正在使用 Dataframes,因为你有 spark-dataframe 标签。

    您可以使用 SQL INTERVAL 来减少时间,但您的列应该是 timestamp 格式:

    df.show(false)
    +-----------------------+
    |ts                     |
    +-----------------------+
    |2017-10-31T23:59:59.000|
    +-----------------------+
    
    import org.apache.spark.sql.functions._
    
    df.withColumn("minus1Sec" , date_format($"ts".cast("timestamp") - expr("interval 1 second") , "yyyy-MM-dd'T'HH:mm:ss.SSS") )
      .withColumn("minus3Mon" , date_format($"ts".cast("timestamp") - expr("interval 3 month ") , "yyyy-MM-dd'T'HH:mm:ss.SSS") )
      .show(false)
    
    +-----------------------+-----------------------+-----------------------+
    |ts                     |minus1Sec              |minus3Mon              |
    +-----------------------+-----------------------+-----------------------+
    |2017-10-31T23:59:59.000|2017-10-31T23:59:58.000|2017-07-31T23:59:59.000|
    +-----------------------+-----------------------+-----------------------+
    

    【讨论】:

    • 是的,我正在研究 Spark Dataframes,需要自定义 udf 来执行此操作
    • @raam 这应该是未来新人接受的答案!
    【解决方案2】:

    试试下面的代码

    val yourDate = "2017-10-31T23:59:59.000"
    val formater = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")
    val date = LocalDateTime.parse(yourDate, formater)
    println(date.minusSeconds(1).toString(formater))
    println(date.minusMonths(3).toString(formater))
    

    输出

    2017-10-31T23:59:58.000
    2017-07-31T23:59:59.000
    

    【讨论】:

      【解决方案3】:

      查看 jodatime 库。它拥有你需要的所有 API,从时间戳中减去几秒或几个月

      http://www.joda.org/joda-time/

      sbt 依赖

      "joda-time" % "joda-time" % "2.9.9"
      

      【讨论】:

      • 是的,我试过了。最后的输出是+11:00。
      • val input = new org.joda.time.DateTime("2017-10-30T00:00:00.000") ; val minusOneSec = input.minusSeconds(1) 并且输出是 2017-10-29T23:59:59.000+11:00 。如何将其转换为父日期格式?
      • DateTimeFormatter df = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss");
      • 我相信引用他们网站的内容对 Java 8(及更高版本)的用户有利:“请注意,从 Java SE 8 开始,用户被要求迁移到 java.time ( JSR-310) - JDK 的核心部分,它取代了这个项目。”
      猜你喜欢
      • 2021-10-06
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      相关资源
      最近更新 更多