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 于南京市江宁区九龙湖