前面介绍了,使用扩展函数可以很方便地扩充数组Array的处理功能,例如交换两个数组元素、求数组的最大元素等等。那么除了数组之外,日期和时间的相关操作,也是很常见的,比如获取当前日期,获取当前时间、获取指定格式的日期时间等等。因此,基本上每个Java书写的Android工程,都需要一个类似DateUtil.java的工具类,用于获得不同格式的时间字符串,下面代码便是一个实现了基础时间拼接的日期工具类例子:

public class DateUtil {//获取当前完整的日期和时间public static String getNowDateTime() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return sdf.format(new Date());}//获取当前时间public static String getNowTime() {SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");return sdf.format(new Date());}//获取当前时间(精确到毫秒)public static String getNowTimeDetail() {SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");return sdf.format(new Date());}
}

注意到上述代码的时间格式存在大小写字母揉合的情况,为避免混淆,有必要对这些格式字符串进行取值说明,详述如下:
小写的yyyy:表示四位年份数字,如1949、2017等等。
大写的MM:表示两位月份数字,如01表示一月份,12表示12月份。
小写的dd:表示两位日期数字,如08表示当月八号,26表示当月二十六号。
大写的HH:表示24小时制的两位小时数字,如19表示晚上七点。
小写的hh:表示12小时制的两位小时数字,如06可同时表示早上六点与傍晚六点;因为12小时制的表达会引发歧义,所以实际开发中很少这么使用。
小写的mm:表示两位分钟数字,如30表示某点三十分。
小写的ss:表示两位秒钟数字。
大写的SSS:表示三位毫秒数字。
其余的横线“-”、空格“ ”、冒号“:”、点号“.”等字符,仅仅是连接符,方便观看各种单位的时间数字而已;对于中文世界来说,也可采用形如“yyyy年MM月dd日HH时mm分ss秒”的格式。现在使用Kotlin的扩展函数,无需声明专门的DateUtil工具类,直接写几个系统日期Date类的扩展函数,即可实现日期时间格式转换的功能,改写后的Date类扩展函数举例如下:

//方法名称前面的Date.表示该方法扩展自Date类
//返回的日期时间格式形如2017-10-01 10:00:00
fun Date.getNowDateTime(): String {val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")return sdf.format(this)
}//只返回日期字符串
fun Date.getNowDate(): String {val sdf = SimpleDateFormat("yyyy-MM-dd")return sdf.format(this)
}//只返回时间字符串
fun Date.getNowTime(): String {val sdf = SimpleDateFormat("HH:mm:ss")return sdf.format(this)
}//返回详细的时间字符串,精确到毫秒
fun Date.getNowTimeDetail(): String {val sdf = SimpleDateFormat("HH:mm:ss.SSS")return sdf.format(this)
}//返回开发者指定格式的日期时间字符串
fun Date.getFormatTime(format: String=""): String {var ft: String = formatval sdf = if (!ft.isEmpty()) SimpleDateFormat(ft)else SimpleDateFormat("yyyyMMddHHmmss")return sdf.format(this)
}

那么调用这些Date类的扩展函数,也不会很复杂,像下面代码通过“Date().getNowDate()”、“Date().getNowTime()”等方法就能获取到相应的日期和时间字符串:

    btn_extend_date.setOnClickListener {//以下方法调用自ExtendDate.kt,采取了扩展函数的方式tv_function_result.text = "扩展函数:" + when (count++%5) {0 -> "当前日期时间为${Date().getNowDateTime()}"1 -> "当前日期为${Date().getNowDate()}"2 -> "当前时间为${Date().getNowTime()}"3 -> "当前毫秒时间为${Date().getNowTimeDetail()}"else -> "当前中文日期时间为${Date().getFormatTime("yyyy年MM月dd日HH时mm分ss秒")}"}}

虽然说上面的扩展函数已经实现相关日期信息的获取,但是调用方式稍显繁琐,比如“Date().getNowDate()”这个日期方法,一共占了四个括号,容易使人产生密集恐惧症。况且这些函数必须从某个已存在的类扩展而来,倘若没有可依赖的具体类,也就无法书写扩展函数了。所以,Java编码常见的***Util工具类,某种程度上反而更灵活、适应面更广,那么Kotlin有没有专门的工具类写法呢?
作为一个后起之秀,Kotlin的设计者显然考虑到了这种情况,并且给出了有针对性的解决方案。在Java之中,不管是工具类还是实体类抑或是业务类,统统采用class关键字,如果是工具类的话,其内部的方法都加上static修饰符,表示该类中的方法无需构造即可调用。如此这般,搞得Java的class像个万金油,啥都能做,却啥都要特殊处理。有鉴于此,Kotlin将工具类的用法提炼了出来,既然这个东西仅仅是作为工具,那么一旦制定了规格就不能再改变了,不能构造也不能修改。故而Kotlin使用对象object关键字加以修饰,并称之为“单例对象”,其实相当于Java的工具类。
单例对象的用法跟传统的类比较,像是一种阉割了的简化类,倘若把普通类比做App,则单例对象好比小程序,用完即走,不留下一抹痕迹。譬如前面提到的getNowDateTime方法,在单例对象中会分解成两个部分,第一个部分是字符串nowDateTime的变量声明,第二个部分是紧跟着的获取变量值的get方法。外部访问单例对象的内部变量,object会自动调用该变量的get方法,下面是采取单例对象改写后的日期时间工具代码:

//关键字object用来声明单例对象,就像Java中开发者自己定义的Utils工具类。
//其内部的属性等同于Java中的static静态属性,外部可直接获取属性值。
object DateUtil {//声明一个当前日期时间的属性,//返回的日期时间格式形如2017-10-01 10:00:00val nowDateTime: String//外部访问DateUtil.nowDateTime时,会自动调用nowDateTime附属的get方法得到它的值get() {val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")return sdf.format(Date())}//只返回日期字符串val nowDate: Stringget() {val sdf = SimpleDateFormat("yyyy-MM-dd")return sdf.format(Date())}//只返回时间字符串val nowTime: Stringget() {val sdf = SimpleDateFormat("HH:mm:ss")return sdf.format(Date())}//返回详细的时间字符串,精确到毫秒val nowTimeDetail: Stringget() {val sdf = SimpleDateFormat("HH:mm:ss.SSS")return sdf.format(Date())}//返回开发者指定格式的日期时间字符串fun getFormatTime(format: String=""): String {val ft: String = formatval sdf = if (!ft.isEmpty()) SimpleDateFormat(ft)else SimpleDateFormat("yyyyMMddHHmmss")return sdf.format(Date())}
}

外部若要访问单例对象的变量值,直接调用“对象名称.变量名称”即可,此时晃瞎眼的括号都不见踪影,一下子干净了许多。调用单例对象的代码例子如下所示:

    btn_object_date.setOnClickListener {//以下方法调用自DateUtil.kt,采取了单例对象的方式tv_function_result.text = "单例对象:" + when (count++%5) {0 -> "当前日期时间为${DateUtil.nowDateTime}"1 -> "当前日期为${DateUtil.nowDate}"2 -> "当前时间为${DateUtil.nowTime}"3 -> "当前毫秒时间为${DateUtil.nowTimeDetail}"else -> "当前中文日期时间为${DateUtil.getFormatTime("yyyy年MM月dd日HH时mm分ss秒")}"}}

点此查看Kotlin入门教程的完整目录

__________________________________________________________________________
打开微信扫一扫下面的二维码,或者直接搜索公众号“老欧说安卓”添加关注,更快更方便地阅读技术干货。

Kotlin入门(18)利用单例对象获取时间相关推荐

  1. Kotlin入门(28)Application单例化

    Application是Android的又一大组件,在App运行过程中,有且仅有一个Application对象贯穿应用的整个生命周期,所以适合在Application中保存应用运行时的全局变量.而开展 ...

  2. 【Kotlin】Kotlin 单例 ( 懒汉式 与 恶汉式 | Java 单例 | Kotlin 单例 | 对象声明 | 伴生对象 | get 方法 | ? 与 !! 判空 )

    文章目录 I . 单例的懒汉式与恶汉式 II . Java 中的懒汉式与恶汉式 III . Kotlin 中对应 Java 的懒汉式与恶汉式 IV . Kotlin 对象 ( object ) 声明 ...

  3. 单例对象会被jvm的gc时回收吗_【PHP设计模式】单例模式

    前言 设计模式是我们开发过程中的重中之重,所以今天小编就来学习设计模式中的单例模式. 单例模式 <?phpclass Singleton { /*** 定义一个静态变量保存已经实例化的对象* * ...

  4. Scala类的定义,主/辅构造器,以及方法中的变量定义,单例对象,伴生对象,Apply方法调用,应用程序对象

    1. 类 1.1. 类的定义 package cn.toto.scala.day2/*** 在Scala中,类并不用声明为public类型的.* Scala源文件中可以包含多个类,所有这些类都具有共有 ...

  5. 2021年大数据常用语言Scala(二十九):scala面向对象 单例对象

    目录 单例对象 定义object - 掌握 伴生对象 - 掌握 apply方法 - 掌握 main方法 单例对象 Scala中没有static关键字,但是它支持静态 如果要定义静态的东西,统统定义到o ...

  6. Scala单例对象(伴生对象)

    概念 Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概 念).但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象 来模拟类对象,该 ...

  7. 【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象

    为何将单例模式移除 在Cocos2d-JS v3.0之前.全部API差点儿都是从Cocos2d-x中移植过来的,这是Cocos2d生态圈统一性的重要一环.可惜的是,这样的统一性也在非常大程度上限制了C ...

  8. 面试官:Spring创建好的单例对象存在线程安全问题吗?

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/jdk_wangtaida/ article/details/88738228 前言 这是我在一次面试中被问到过的问题,但是当时 ...

  9. 静态工具类使用单例对象线程安全问题注意1

    1.记录问题 1.1工具类代码 public static SimpleDateFormat sdfTest = new SimpleDateFormat("yyyy年MM月dd日" ...

最新文章

  1. tomcat WARNING [ContainerBackgroundProcessor[StandardEngine[Catalina]]]
  2. qmail+spamassassin启用spf过滤
  3. FPGA+DSP SRIO通信(一)——DSP端参数设置(通道)
  4. windows上安装mysql
  5. P3195 [HNOI2008]玩具装箱TOY
  6. React Portals与Error Boundaries
  7. excel 统计字数公式
  8. 使用计算机控制台方法,故障控制台使用方法
  9. BUPT复试专题—统计字母(2008)
  10. Flask 参数简介
  11. SQL必知必会阅读笔记
  12. 魔兽争霸3运行速度慢的一些优化办法。
  13. CorelDRAW弄什么封面都是很简单的事呢
  14. 2022-2028年中国美容美发行业现状调研与未来前景趋势报告
  15. 专访当当网张亮:深度解读分布式作业调度框架elastic-job
  16. 【Ubuntu】用g++生成动态库
  17. 苹果手机换android,我从苹果手机换回了安卓手机,是怎样的体验呢?
  18. STEP2——《数据分析:企业的贤内助》重点摘要笔记(二)——数据获取资源...
  19. C#远程主机强迫关闭一个现有链接问题简述
  20. 第三方直播美颜SDK的美颜功能是怎么实现的?

热门文章

  1. Python爬虫入门之使用Redis+Flask维护动态代理池
  2. mlfviewer_语音识别ASR - HTK(HResults)计算字错率WER、句错率SER
  3. 三星linux打印机驱动官网下载,三星SL-C515驱动
  4. libiconv字符集转换库使用方法
  5. linux卸载tar安装的erlang包,linux - 从tar安装erlang导致错误,想知道如何指定文件夹 - 堆栈内存溢出...
  6. MyBatis3源码解析(6)TypeHandler使用
  7. Spring Boot Mybatis入门示例
  8. python票务系统_列车票务系统
  9. java 输入框_Java文本框和文本区的输入输出
  10. 在java中创建线程有几种办法_Java中创建线程的几种主流方式