Scala 之日期和时间

目录

前言

SimpleDateFormat

FastDateFormat

Joda-Time

代码实例

其他操作


前言

对时间和日期处理的主要方法:SimpleDateFormat,FastDateFormat和Joda-Time。

SimpleDateFormat

SimpleDateFormat 是线程不安全的,是因为SimpleDateFormat在对时间进行格式化的时候,先对calendar对象进行setTime操作,在多次调用SimpleDateFormat的时候,就会对该对象进行覆盖,造成线程不安全。

解决方法:

  1. 在每次需要使用的时候,进行SimpleDateFormat实例的创建,会占用一定的内存,不建议使用。
  2. 使用同步的方式,对SimpleDateFormat进行加锁,,也就是会造成线程间的互斥,对性能影响比较大。
  3. 使用ThreadLocal进行保存,相当于一个线程只会有一个实例,进而减少了实例数量,也防止了线程间的互斥,推荐使用这种方式。

FastDateFormat

FastDateFormat是线程安全的,可以直接使用,不必考虑多线程的情况

Joda-Time

Joda-Time与以上两种有所区别,不仅仅可以对时间进行格式化输出,而且可以生成瞬时时间值,并与Calendar、Date等对象相互转化,极大的方便了程序的兼容性。Joda-Time的类具有不可变性,因此他们的实例是无法修改的,就跟String的对象一样。这种不可变性提现在所有API方法中,这些方法返回的都是新的类实例,与原来实例不同。

代码实例

package com.pingan.spark_graphx001

import java.time.LocalDate

/*
* Create By Jerry on 2019/1/16
* */

object Test_Time001 {
  def main(args: Array[String]): Unit = {
    val nowdate = LocalDate.now()
    println("LocalDate.now()-->现在的时间是"+LocalDate.now())
    println("nowdate.plusDays-->明天是-->"+nowdate.plusDays(1))
    println("nowdate.minusDays-->昨天是-->"+nowdate.minusDays(1))
    println("nowdate.plusMonths-->今天加一个月-->"+nowdate.plusMonths(1))
    println("nowdate.minusMonths-->今天减一个月-->"+nowdate.minusMonths(1))
    println("nowdate.getDayOfYear-->今天是今年的第"+nowdate.getDayOfYear+"天")
    println("nowdate.getDayOfMonth->这个月有"+nowdate.getDayOfMonth+"天")
    println("nowdate.getDayOfWeek-->今天星期"+nowdate.getDayOfWeek)
    println("nowdate.getMonth-->这个月是"+nowdate.getMonth)
  }
}

运行结果:

LocalDate.now()-->现在的时间是2019-01-16
nowdate.plusDays-->明天是-->2019-01-17
nowdate.minusDays-->昨天是-->2019-01-15
nowdate.plusMonths-->今天加一个月-->2019-02-16
nowdate.minusMonths-->今天减一个月-->2018-12-16
nowdate.getDayOfYear-->今天是今年的第16天
nowdate.getDayOfMonth->这个月有16天
nowdate.getDayOfWeek-->今天星期WEDNESDAY
nowdate.getMonth-->这个月是JANUARY

Process finished with exit code 0

其他操作

package com.pingan.spark_graphx001

import java.time.LocalDate
import java.util.{Calendar, Date}

import org.apache.commons.lang.time.FastDateFormat

/*
* Create By Jerry on 2019/1/16
* */

object Test_Time001 {
  def main(args: Array[String]): Unit = {
//    获取今天日期
    def getNowDate():String={
      var now:Date = new Date()
      var  dateFormat = FastDateFormat.getInstance("yyyy-MM-dd")
      var today = dateFormat.format( now )
      today
    }

//    获取昨天的时间
    def getYesterday():String= {
      var dateFormat = FastDateFormat.getInstance("yyyy-MM-dd")
      var cal = Calendar.getInstance()
      cal.add(Calendar.DATE, -1)
      var yesterday = dateFormat.format(cal.getTime())
      yesterday
    }

//    获取本周开始日期
    def getNowWeekStart():String={
      var day:String=""
      var cal:Calendar =Calendar.getInstance();
      var df =  FastDateFormat.getInstance("yyyy-MM-dd");
      cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
      //获取本周一的日期
      day=df.format(cal.getTime())
      day
    }

//    获取本周末日期
    def getNowWeekEnd():String={
      var day:String=""
      var cal:Calendar =Calendar.getInstance();
      var df = FastDateFormat.getInstance("yyyy-MM-dd");
      cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);//这种输出的是上个星期周日的日期,因为老外把周日当成第一天
      cal.add(Calendar.WEEK_OF_YEAR, 1)// 增加一个星期,才是我们中国人的本周日的日期
      day=df.format(cal.getTime())
      day
    }

//    本月的第一天
    def getNowMonthStart():String= {
      var day: String = ""
      var cal: Calendar = Calendar.getInstance();
      var df = FastDateFormat.getInstance("yyyy-MM-dd");
      cal.set(Calendar.DATE, 1)
      day = df.format(cal.getTime()) //本月第一天
      day
    }

//    本月最后一天
    def getNowMonthEnd():String={
      var day:String=""
      var cal:Calendar =Calendar.getInstance();
      var df = FastDateFormat.getInstance("yyyy-MM-dd");
      cal.set(Calendar.DATE, 1)
      cal.roll(Calendar.DATE,-1)
      day=df.format(cal.getTime())//本月最后一天
      day
    }

//    将时间戳转化成日期/时间
    def DateFormat(time:String):String={
      var sdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
      var date:String = sdf.format(new Date((time.toLong)))
      date
    }

//    计算时间差
    def getCoreTime(start_time:String,end_Time:String)={
      var df = FastDateFormat.getInstance("HH:mm:ss")
      val begin = start_time
      val end = end_Time
      var between = (end.toLong - begin.toLong)/1000  //转化成秒
      var minute = between % 60 //转化为分钟
      val hour = between % (60*60) //转化为小时
    }
  }
}

(如有不对的地方,欢迎指正。)

 

 

 

你可能感兴趣的:(Scala,日期/时间/时间戳)