前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kotlin入门(18)利用单例对象获取时间

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

作者头像
aqi00
发布2019-01-18 15:38:50
8920
发布2019-01-18 15:38:50
举报
文章被收录于专栏:老欧说安卓老欧说安卓

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

代码语言:javascript
复制
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类扩展函数举例如下:

代码语言:javascript
复制
//方法名称前面的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 = format
    val sdf = if (!ft.isEmpty()) SimpleDateFormat(ft)
    else SimpleDateFormat("yyyyMMddHHmmss")
    return sdf.format(this)
}

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

代码语言:javascript
复制
    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方法,下面是采取单例对象改写后的日期时间工具代码:

代码语言:javascript
复制
//关键字object用来声明单例对象,就像Java中开发者自己定义的Utils工具类。
//其内部的属性等同于Java中的static静态属性,外部可直接获取属性值。
object DateUtil {

    //声明一个当前日期时间的属性,
    //返回的日期时间格式形如2017-10-01 10:00:00
    val nowDateTime: String
        //外部访问DateUtil.nowDateTime时,会自动调用nowDateTime附属的get方法得到它的值
        get() {
            val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
            return sdf.format(Date())
        }

    //只返回日期字符串
    val nowDate: String
        get() {
            val sdf = SimpleDateFormat("yyyy-MM-dd")
            return sdf.format(Date())
        }

    //只返回时间字符串
    val nowTime: String
        get() {
            val sdf = SimpleDateFormat("HH:mm:ss")
            return sdf.format(Date())
        }

    //返回详细的时间字符串,精确到毫秒
    val nowTimeDetail: String
        get() {
            val sdf = SimpleDateFormat("HH:mm:ss.SSS")
            return sdf.format(Date())
        }

    //返回开发者指定格式的日期时间字符串
    fun getFormatTime(format: String=""): String {
        val ft: String = format
        val sdf = if (!ft.isEmpty()) SimpleDateFormat(ft)
                    else SimpleDateFormat("yyyyMMddHHmmss")
        return sdf.format(Date())
    }
}

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

代码语言:javascript
复制
    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入门教程的完整目录

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年09月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档