Scala103-日期处理

Intro

  介绍常用的日期处理方法。

时间获取

import org.joda.time.format.DateTimeFormat
import org.joda.time.{DateTime, Period,Duration}
Intitializing Scala interpreter ...



Spark Web UI available at http://DESKTOP-LAO32FQ:4041
SparkContext available as 'sc' (version = 2.4.4, master = local[*], app id = local-1578101041406)
SparkSession available as 'spark'






import org.joda.time.format.DateTimeFormat
import org.joda.time.{DateTime, Period, Duration}

获取当前时间-时间戳

val nowTimestamp = System.currentTimeMillis()
nowTimestamp: Long = 1578101045890

获取当前时间-日期

val nowDate = new DateTime(nowTimestamp)
nowDate: org.joda.time.DateTime = 2020-01-04T09:24:05.890+08:00

格式化日期

把日期转换成字符串,主要对应三种格式:

  • yyyy-MM-dd HH:mm:ss
  • yyyy-MM-dd
  • yyyyMMdd
val DateFormat1 = "yyyy-MM-dd HH:mm:ss"
val DateFormat2 = "yyyy-MM-dd"
val DateFormat3 = "yyyyMMdd"
DateFormat1: String = yyyy-MM-dd HH:mm:ss
DateFormat2: String = yyyy-MM-dd
DateFormat3: String = yyyyMMdd
Array(DateFormat1,DateFormat2,DateFormat3).foreach(x=>println("["+x+"] =>"+"  Convert to=>"+nowDate.toString(x)))
[yyyy-MM-dd HH:mm:ss] =>  Convert to=>2020-01-04 09:24:05
[yyyy-MM-dd] =>  Convert to=>2020-01-04
[yyyyMMdd] =>  Convert to=>20200104

类型转换

时间戳转换

时间戳转日期

new DateTime(nowTimestamp)
res1: org.joda.time.DateTime = 2020-01-04T09:24:05.890+08:00
nowDate.getClass.getSimpleName
res2: String = DateTime

日期转时间戳

nowDate.getMillis
res3: Long = 1578101045890

字符串转换

日期转字符串

nowDate.toString("yyyy-MM-dd")
res4: String = 2020-01-04

字符串转日期
注意,如果字符串没有时分秒,会默认转成0点0分0秒

val StringDateArray = Array("2020-01-01 10:10:10","2020-01-02","20200103")
val FormatArray = Array(DateFormat1,DateFormat2,DateFormat3) 
StringDateArray: Array[String] = Array(2020-01-01 10:10:10, 2020-01-02, 20200103)
FormatArray: Array[String] = Array(yyyy-MM-dd HH:mm:ss, yyyy-MM-dd, yyyyMMdd)
for(i<-0 until 3){
println("Raw:"+StringDateArray(i)+"\n"+"New:"+DateTime.parse(StringDateArray(i), DateTimeFormat.forPattern(FormatArray(i))))
}
Raw:2020-01-01 10:10:10
New:2020-01-01T10:10:10.000+08:00
Raw:2020-01-02
New:2020-01-02T00:00:00.000+08:00
Raw:20200103
New:2020-01-03T00:00:00.000+08:00

运算

转换成时间戳

repeat once more

DateTime.parse("2020-01-01 01:00:01",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getMillis
res6: Long = 1577811601000

时刻属性

该时刻所拥有的属性,如

  • 属于当天的哪一个小时
  • 属于该小时的哪一分钟
  • 属于分钟的哪一秒

时分秒

DateTime.parse("2020-01-01 21:00:01",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getHourOfDay
res7: Int = 21
DateTime.parse("2020-01-01 11:11:11",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getMinuteOfHour
res8: Int = 11
DateTime.parse("2020-01-01 11:12:31",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getSecondOfMinute
res9: Int = 31

再如:

  • 该日期属于哪一个月
  • 该日期属于当年的第几周
  • 该日期属于周几
  • 该日期属于当年的第几天

月份信息

DateTime.parse("2019-12-29 02:00:01",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getMonthOfYear
res10: Int = 12
DateTime.parse("2020-01-01 02:00:01",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getMonthOfYear
res11: Int = 1

周信息
注意,跨年度的周,从1记起

DateTime.parse("2019-12-29 02:00:01",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getWeekOfWeekyear
res12: Int = 52
DateTime.parse("2019-12-31 02:00:01",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getWeekOfWeekyear
res13: Int = 1
DateTime.parse("2020-01-01 02:00:01",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getWeekOfWeekyear
res14: Int = 1

周几信息

周一即为1,周日为7

DateTime.parse("2019-12-31 02:00:01",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getDayOfWeek
res15: Int = 2
DateTime.parse("2020-01-01 02:00:01",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getDayOfWeek
res16: Int = 3

该日期在当年的天数

DateTime.parse("2020-01-01 02:00:01",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getDayOfYear
res17: Int = 1
DateTime.parse("2019-12-31 02:00:01",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getDayOfYear
res18: Int = 365

还有其他的方法,暂时用不到,不赘

两日期间隔

val testDate1 = DateTime.parse("2020-01-01 01:00:01",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"))
val testDate2 = DateTime.parse("2020-01-01 02:00:02",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"))
val testDate3 = DateTime.parse("2019-12-31 02:00:01",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"))
testDate1: org.joda.time.DateTime = 2020-01-01T01:00:01.000+08:00
testDate2: org.joda.time.DateTime = 2020-01-01T02:00:02.000+08:00
testDate3: org.joda.time.DateTime = 2019-12-31T02:00:01.000+08:00
val diffDuration = new Duration(testDate1,testDate2)
diffDuration: org.joda.time.Duration = PT3601S

毫秒为单位

diffDuration.getMillis
res19: Long = 3601000
//实际相差1小时1秒  
(60*60+1)*1000
res20: Int = 3601000

秒为单位

diffDuration.getStandardSeconds
res21: Long = 3601

分钟为单位
直接取整

diffDuration.getStandardMinutes
res22: Long = 60

小时为单位

diffDuration.getStandardHours
res23: Long = 1

天为单位

diffDuration.getStandardDays
res24: Long = 0

某日期间隔N天的日期

间隔为正,向后推算;间隔为负,向前推算

  • plusDays 天数为单位
  • plusMonths 月份为单位

其他的不多说,用到再补充~

testDate1
res25: org.joda.time.DateTime = 2020-01-01T01:00:01.000+08:00
testDate1.plusDays(1)
res26: org.joda.time.DateTime = 2020-01-02T01:00:01.000+08:00
testDate1.plusDays(-1)
res27: org.joda.time.DateTime = 2019-12-31T01:00:01.000+08:00
testDate1.plusMonths(1)
res28: org.joda.time.DateTime = 2020-02-01T01:00:01.000+08:00

时间比较

时间比较具体如下:

  • isAfter
  • isBefor
  • isEqual
testDate1.isAfter(testDate2)
res29: Boolean = false
testDate1.isBefore(testDate2)
res30: Boolean = true
testDate1.isEqual(testDate2)
res31: Boolean = false

生成日期list

import scala.collection.mutable.ArrayBuffer
def dateRangeList(from: String, to: String,stepdays:Int=1,format:String="yyyy-MM-dd"):Array[String]={
    // 先转换成日期
    val fromDate = DateTime.parse(from,DateTimeFormat.forPattern("yyyy-MM-dd"))
    val toDate = DateTime.parse(to,DateTimeFormat.forPattern("yyyy-MM-dd")).plusDays(1)
    val dateRangeBuffer = ArrayBuffer[String]()
    var tempDate = fromDate
    while(tempDate.isBefore(toDate)){
        dateRangeBuffer.append(tempDate.toString(format))
        tempDate = tempDate.plusDays(stepdays)
    }
    dateRangeBuffer.toArray
}
import scala.collection.mutable.ArrayBuffer
dateRangeList: (from: String, to: String, stepdays: Int, format: String)Array[String]
dateRangeList("2019-12-25","2019-12-30").mkString("\n")
res32: String =
2019-12-25
2019-12-26
2019-12-27
2019-12-28
2019-12-29
2019-12-30
dateRangeList(from="2019-12-25",to="2019-12-30",stepdays=2).mkString("\n")
res33: String =
2019-12-25
2019-12-27
2019-12-29

Ref

[1]https://www.joda.org/joda-time/

                        2020-01-04 于南京市江宁区九龙湖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值