您现在的位置是:首页 > 正文

kotlin用到的时间工具:前后x天,前后x分钟,某小时初始,某小时结束,周一,周日,月第一天,月最后一天,季度第一天,季度最后一天,年度第一天,年度最后一天

2024-02-01 02:04:33阅读 3

代码如下:

// 当天前后x天的时间,value负数表示x天前,正数表示x天后
    fun getDay(value: Int): Timestamp {
        val cal = Calendar.getInstance()
        cal.add(Calendar.DAY_OF_MONTH, value)
        return Timestamp(cal.timeInMillis)
    }

    // 某个时间x分钟前后的时间,value负数表示x分钟前,正数表示x分钟后
    fun getMinute(currentTime: Timestamp, value: Int): Timestamp {
        val cal = Calendar.getInstance()
        cal.time = currentTime
        cal.add(Calendar.MINUTE, value)
        return Timestamp(cal.timeInMillis)
    }

    // 当天某小时初始时间,value表示某小时
    fun getHourStart(value: Int): Timestamp {
        val cal = Calendar.getInstance()
        cal.set(Calendar.HOUR_OF_DAY, value)
        cal.set(Calendar.SECOND, 0)
        cal.set(Calendar.MINUTE, 0)
        cal.set(Calendar.MILLISECOND, 0)
        return Timestamp(cal.timeInMillis)
    }

    // 当天某小时结束时间,value表示某小时
    fun getHourEnd(value: Int): Timestamp {
        val cal = Calendar.getInstance()
        cal.set(Calendar.HOUR_OF_DAY, value)
        cal.set(Calendar.SECOND, 59)
        cal.set(Calendar.MINUTE, 59)
        cal.set(Calendar.MILLISECOND, 999)
        return Timestamp(cal.timeInMillis)
    }

    // 周一时间 value: 0表示本周,1表示下周,-1表示上周
    fun getWeekStartTime(value: Int): Timestamp {
        val cal = Calendar.getInstance()
        val weekday = cal.get(Calendar.DAY_OF_WEEK) - value * 7
        cal.add(Calendar.DATE, 2 - weekday)
        return Timestamp(cal.timeInMillis)
    }

    // 周日时间 value: 0表示本周,1表示下周,-1表示上周
    fun getWeekEndTime(value: Int): Timestamp {
        val cal = Calendar.getInstance()
        val weekday = cal.get(Calendar.DAY_OF_WEEK) - value * 7
        cal.add(Calendar.DATE, 8 - weekday)
        return Timestamp(cal.timeInMillis)
    }

    // 月第一天时间 value: 0表示本月,1表示下月,-1表示上月
    fun getMonthStartTime(value: Int): Timestamp {
        val cal = Calendar.getInstance()
        cal.add(Calendar.MONTH, value);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH))
        return Timestamp(cal.timeInMillis)
    }

    // 月最后一天时间 value: 0表示本月,1表示下月,-1表示上月
    fun getMonthEndTime(value: Int): Timestamp {
        val cal = Calendar.getInstance()
        cal.add(Calendar.MONTH, value);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH))
        return Timestamp(cal.timeInMillis)
    }

    // 季度第一天时间 value: 0表示本季度,1表示下季度,-1表示上季度
    fun getQuarterStartTime(value: Int): Timestamp {
        val cal = Calendar.getInstance()
        val currentMonth = cal.get(Calendar.MONTH) + 1 + value * 3
        //只计算到去年第四季度或明年第一季度
        val month: Int = if (currentMonth < 1) 9 else if (currentMonth in 1..3) 0 else if (currentMonth in 4..6) 3 else if (currentMonth in 7..9) 6 else if (currentMonth in 10..12) 9 else 0
        if (currentMonth < 1) cal.add(Calendar.YEAR, -1) else if (currentMonth > 12) cal.add(Calendar.YEAR, 1) else {
        }
        cal.set(Calendar.MONTH, month)
        cal.set(Calendar.DATE, 1)
        return Timestamp(cal.timeInMillis)
    }

    // 季度最后一天时间 value: 0表示本季度,1表示下季度,-1表示上季度
    fun getQuarterEndTime(value: Int): Timestamp {
        val cal = Calendar.getInstance()
        val currentMonth = cal.get(Calendar.MONTH) + 1 + value * 3
        //只计算到去年第四季度或明年第一季度
        val month: Int = if (currentMonth < 1) 11 else if (currentMonth in 1..3) 2 else if (currentMonth in 4..6) 5 else if (currentMonth in 7..9) 8 else if (currentMonth in 10..12) 11 else 2
        val day: Int = if (currentMonth < 1) 31 else if (currentMonth in 1..3) 31 else if (currentMonth in 4..6) 30 else if (currentMonth in 7..9) 30 else if (currentMonth in 10..12) 31 else 31
        if (currentMonth < 1) cal.add(Calendar.YEAR, -1) else if (currentMonth > 12) cal.add(Calendar.YEAR, 1) else {
        }
        cal.set(Calendar.MONTH, month)
        cal.set(Calendar.DATE, day)
        return Timestamp(cal.timeInMillis)
    }

    //年度第一天时间 value: 0表示今年,1表示明年,-1表示去年
    fun getYearStartTime(value: Int): Timestamp {
        val cal = Calendar.getInstance()
        cal.add(Calendar.YEAR, value);
        cal.set(Calendar.MONTH, 0)
        cal.set(Calendar.DATE, 1)
        return Timestamp(cal.timeInMillis)
    }

    //年度最后一天时间 value: 0表示今年,1表示明年,-1表示去年
    fun getYearEndTime(value: Int): Timestamp {
        val cal = Calendar.getInstance()
        cal.add(Calendar.YEAR, value);
        cal.set(Calendar.MONTH, 11)
        cal.set(Calendar.DATE, 31)
        return Timestamp(cal.timeInMillis)
    }

部分自测的结果

@Test
    fun testDate(){
        val value = 4
        val ds = commUtil.getHourStart(0)
        val de = commUtil.getHourEnd(23)
        val dd = commUtil.getHourStart(8)
        val ws = commUtil.getWeekStartTime(-38)
        val we = commUtil.getWeekEndTime(-38)
        val ms = commUtil.getMonthStartTime(value)
        val me = commUtil.getMonthEndTime(value)
        val qs = commUtil.getQuarterStartTime(-5)
        val qe = commUtil.getQuarterEndTime(-5)
        val ys = commUtil.getYearStartTime(value)
        val ye = commUtil.getYearEndTime(value)
        log.info(">>>天:$ds>>>$de>>>$dd>>>周:$ws>>>$we>>>月:$ms>>>$me>>>季:$qs>>>$qe>>>年:$ys>>>$ye")
    }

当天0点,当天24点,当天8点,38周前周一,38周前周日,四个月后月初,四个月后月末,去年第四季度起始,去年第四季度结束,四年年初,四年年末

>>>天:2018-09-19 00:00:00.0>>>2018-09-19 23:59:59.999>>>2018-09-19 08:00:00.0>>>周:2017-12-25 11:29:01.449>>>2017-12-31 11:29:01.449>>>月:2019-01-01 11:29:01.449>>>2019-01-31 11:29:01.449>>>季:2017-10-01 11:29:01.449>>>2017-12-31 11:29:01.449>>>年:2022-01-01 11:29:01.449>>>2022-12-31 11:29:01.449

---------------------------------2018-12-20增加-------------------------------------

// 获取日期范围(用于折线图)
    fun getDateRange(startDate: String, endDate: String): List<String> {
        val sdf = SimpleDateFormat("yyyy-MM-dd")
        val ssdf = SimpleDateFormat("MM月dd日")
        val calendar = Calendar.getInstance()
        val sDate = sdf.parse(startDate)
        calendar.time = sDate
        val calendarEnd = Calendar.getInstance()
        calendarEnd.time = sDate
        val dateList = ArrayList<String>()
        dateList.add(ssdf.format(sDate))
        val edate = sdf.parse(endDate)
        while (calendarEnd.time.before(edate)) {
            calendarEnd.add(Calendar.DAY_OF_MONTH, 1)
            val tempDate = ssdf.format(calendarEnd.time)
            dateList.add(tempDate)
        }
        return dateList
    }

    // 获取年月范围(用于折线图)
    fun getMonthRange(startDate: String, endDate: String): List<String> {
        val sdf = SimpleDateFormat("yyyy-MM")
        val calendar = Calendar.getInstance()
        val sd = sdf.parse(startDate)
        calendar.time = sd
        val monthList = ArrayList<String>()
        monthList.add(sdf.format(sd))
        val ed = sdf.parse(endDate)
        while (calendar.time.before(ed)) {
            calendar.add(Calendar.MONTH, 1)
            val tempDate = sdf.format(calendar.time)
            monthList.add(tempDate)
        }
        return monthList
    }

测试:

>>>[11月15日, 11月16日, 11月17日, 11月18日, 11月19日, 11月20日, 11月21日, 11月22日, 11月23日, 11月24日, 11月25日, 11月26日, 11月27日, 11月28日, 11月29日, 11月30日, 12月01日, 12月02日, 12月03日, 12月04日, 12月05日, 12月06日]
>>>[2018-01, 2018-02, 2018-03, 2018-04, 2018-05, 2018-06, 2018-07, 2018-08, 2018-09, 2018-10, 2018-11, 2018-12]

时间格式可以参照(SimpleDateFormat(“MM月dd日”))这样定义

网站文章

  • ubuntu22.04 解决 pip install mysql-python问题

    解决pip install mysql-python 问题

    2024-02-01 02:04:25
  • eNSP下的smart-link 和 monitor-link

    eNSP下的smart-link 和 monitor-link

    拓扑结构图: PC1:192.168.10.1 24 PC2:192.168.10.2 24 LSW1: sys sys L1 undo info-center enable //关闭提示信息 //先...

    2024-02-01 02:03:51
  • BZOJ4025 二分图

    ProblemBZOJSolution关于二分图的判定,我们可以考虑原图的一个生成树,然后对于所有非树边,我们统计一下奇环个数即可然后可以用时间线段树,带权并查集维护一下路径上的点的个数,时间复杂度是O(mlog⁡Tlog⁡n)O(m\log T\log n)O(mlogTlogn)也可以用lct维护时间最大生成树,注意一下细节即可,时间复杂度是O(mlog⁡n)O(m\log n)O(...

    2024-02-01 02:03:44
  • 数据结构之稀疏数组

    数据结构之稀疏数组

    目录一、稀疏数组的基本介绍二、稀疏数组的应用场景三、稀疏数组的处理方法四、二维数组转稀疏数组的思路五、稀疏数组转二维数组的思路六、具体代码实现一、稀疏数组的基本介绍当一个数组中大部分元素为0,或者为同...

    2024-02-01 02:03:37
  • 使用MyBatis in查询(单次查询)和for循环查询(多次查询) 的效率问题

    中嵌套子查询语句的情况,确实有这么一回事,但本文不做讨论,因为实际的开发中&quot;关联表查询影响效率的问题&quot;是可以在设计上避免的,而且也应该在设计上避免。语句中不包含子查询,而是确切的一...

    2024-02-01 02:03:02
  • TCP通信转HTTP桥接器(转发zabbix数据为例)

    以zabbix通信转发为例,说明通过HTTP协议转发TCP请求的过程以及相应程序的设计实现与最终效果。

    2024-02-01 02:02:55
  • JAVA递归练习—打印图形

    1. 打印乘法口诀 package cn.oop.program; /** * 打印乘法口诀 * @author 温暖wk * 2018.8.18 */ public class ChengFa { public static void main(String[] args) { System.out.println(&quot;乘法口诀如下:&quot;); f...

    2024-02-01 02:02:46
  • 网络安全专业很吃香?不见得,小白避坑的建议

    网络安全专业很吃香?不见得,小白避坑的建议

    近年来,随着国家对网络安全的战略关注和新基建的持续投入,网络安全专业成为一个热门话题。然而,好专业不一定就能找到好工作,对于想从事网络安全专业的小白们,需要持谨慎态度,避免走一些弯路。一.学习网络安全...

    2024-02-01 02:02:40
  • Spring eureka 启动报错 Error processing condition on org.springframework.cloud.client.loadbalancer.Asyn

    Spring eureka 启动报错 Error processing condition on org.springframework.cloud.client.loadbalancer.Async...

    2024-02-01 02:02:12
  • Redisson分布式限流器RRateLimiter原理解析

    因为公司的开放网关的限流模块就是基于Redisson开发的,之前看的版本源码与最新的已经有很大的不同,趁着整理知识点的机会下了最新版的源码看了一遍。限流这个说简单也简单,说复杂也复杂。不知道是不是我看的东西太少,我觉得redisson的限流器设计非常精巧,感觉把redis玩穿了。

    2024-02-01 02:02:06