Android 中获取时间的几种方法

在Android开发中,有多种方法可以获取时间,以下是几种常见的方法:

1、使用System.currentTimeMillis()

这是最简单的一种获取时间的方法,它返回从1970年1月1日00:00:00 GMT(格林威治时间)开始到现在的毫秒数。

	/**
     * 获取当前时间戳,单位毫秒
     */
    fun getCurrentTimeMillis() {
        val currentTimeMillis = System.currentTimeMillis()
        Log.d(TAG, "[getCurrentTimeMillis] 当前时间戳(毫秒):$currentTimeMillis")
    }

2、使用Calendar类

Calendar类提供了更灵活的时间操作功能,可以获取和设置日期和时间的各个组成部分。

	val calendar = Calendar.getInstance()

  	// 获取具体的年、月、日、时、分、秒、星期
    val year = calendar.get(Calendar.YEAR)
    // 月份从 0 开始
    val month = calendar.get(Calendar.MONTH) + 1
    val day = calendar.get(Calendar.DAY_OF_MONTH)
    val hour = calendar.get(Calendar.HOUR_OF_DAY)
    val minute = calendar.get(Calendar.MINUTE)
    val second = calendar.get(Calendar.SECOND)
    // 从星期日开始,星期日为 1
    val week = calendar.get(Calendar.DAY_OF_WEEK)
    Log.d(TAG, " 当前时间: $year-$month-$day $hour:$minute:$second  week:$week")

3、使用Date类

Date类代表一个特定的瞬间,精确到毫秒。

    val date = Date()
    Log.d(TAG, "当前时间:$date")

    // 如果需要格式化日期,可以使用SimpleDateFormat
    val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
    val formattedDate: String = sdf.format(date)
    Log.d(TAG, "格式化后的日期:$formattedDate")

4、使用Time类(不推荐,已废弃)

    val time = Time() // 创建Time对象
    time.setToNow() // 设置为当前时间
    val year: Int = time.year // 获取年份
    val month: Int = time.month + 1 // 获取月份,月份从0开始,需要加1
    val day: Int = time.monthDay // 获取日期
    val hour: Int = time.hour // 获取小时(24小时制)
    val minute: Int = time.minute // 获取分钟
    val second: Int = time.second // 获取秒数
    Log.d(TAG, "当前时间:${year}年${month}月${day}日 ${hour}:$minute:$second")

5、使用SystemClock类

SystemClock类提供了几种不同的时间获取方式,适用于不同的场景:

  • SystemClock.elapsedRealtime():返回自设备启动以来的时间(不包括睡眠时间),单位为毫秒。
  • SystemClock.uptimeMillis():返回自设备启动以来的时间(包括睡眠时间),单位为毫秒。
  • SystemClock.currentThreadTimeMillis():返回当前线程的CPU时间,单位为毫秒。
    val elapsedRealtime= SystemClock.elapsedRealtime()
    Log.d("ElapsedRealtime", "自设备启动以来的时间(不包括睡眠时间):$elapsedRealtime")

    val uptimeMillis = SystemClock.uptimeMillis()
    Log.d("UptimeMillis", "自设备启动以来的时间(包括睡眠时间):$uptimeMillis")

    val currentThreadTimeMillis = SystemClock.currentThreadTimeMillis()
    Log.d("CurrentThreadTimeMillis", "当前线程的CPU时间:$currentThreadTimeMillis")

6、将 Long 型时间戳转换成字符串

	import android.icu.text.SimpleDateFormat
	import java.util.Date
	import java.util.Locale
	
    /**
     *  将 Long 型时间戳转换为时间字符串(2001-01-01 01:01:01)
     *  @param timestamp 时间戳
     */
    fun getTimeFromTimestamp(timestamp: Long): String {
        // 将时间戳转换为 Date 对象
        val date = Date(timestamp)

        // 定义时间格式
        val formatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())

        // 将 Date 对象格式化为字符串
        return formatter.format(date)
    }

7、获取上周第一天的时间

	/**
     * 获取今天是星期几
     * @return 1-7 (星期一 ~ 星期日)
     */
    fun getDayOfWeek(): Int {
        return Calendar.getInstance().get(Calendar.DAY_OF_WEEK)
    }

    /**
     * 获取本周或上周第一天的日期
     * @param type 0:本周 1:上周
     */
    fun getFirstDayOfWeek(type: Int): String {
        val calendar = Calendar.getInstance()

        // 设置周一为一周的第一天
        calendar.firstDayOfWeek = Calendar.MONDAY
        // 设置当前时间为周一
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
        if (type == 1) {
            // 向前推一周
            calendar.add(Calendar.DAY_OF_YEAR, -7)
        }
        // 设置时间为当天的 00:00:00
        calendar.set(Calendar.HOUR_OF_DAY, 0)
        calendar.set(Calendar.MINUTE, 0)
        calendar.set(Calendar.SECOND, 0)
        calendar.set(Calendar.MILLISECOND, 0)

        // 格式化时间
        val format = SimpleDateFormat("yyyyMMdd", Locale.getDefault())
        val formatDate = format.format(calendar.time)
        Log.d(TAG, "[getFirstDayOfWeek] first day of week: $formatDate")
        return formatDate
    }

8、获取增减天数、周数、月份数后的时间

	package com.android.example.ui.utils
	
	import android.icu.util.Calendar
	import android.icu.util.TimeZone
	import android.util.Log
	import java.text.SimpleDateFormat
	import java.util.Locale
	
	object DateTimeUtils {
	
	    private const val TAG = "DateTimeUtils"
	
	    /**
	     * 获取今天是星期几
	     * @return 1-7 (星期一 ~ 星期日)
	     */
	    fun getDayOfWeek(): Int {
	        return Calendar.getInstance().get(Calendar.DAY_OF_WEEK)
	    }
	
	    /**
	     * 增加天数后的时间
	     * @param days 增减天数 0-当天
	     */
	    fun getBeforeOrLastDays(days: Int): String {
	        val calendar = Calendar.getInstance()
	
	        // 设置周一为一周的第一天
	        calendar.firstDayOfWeek = Calendar.MONDAY
	        // 设置当前时间为周一
	        calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
	        // 增减天数
	        calendar.add(Calendar.DAY_OF_YEAR, days)
	        // 设置时间为当天的 00:00:00
	        calendar.set(Calendar.HOUR_OF_DAY, 0)
	        calendar.set(Calendar.MINUTE, 0)
	        calendar.set(Calendar.SECOND, 0)
	        calendar.set(Calendar.MILLISECOND, 0)
	
	        // 格式化时间
	        val format = SimpleDateFormat("yyyyMMdd", Locale.getDefault())
	        val formatDate = format.format(calendar.time)
	        Log.d(TAG, "[getBeforeOrLastOfDays] days: $days, time: $formatDate")
	        return formatDate
	    }
	
	    /**
	     * 获取月份时间
	     * @param months 增减月份 0: 本月 >0 往后月份 <0 往前月份
	     * @return 时间字符串:202404
	     */
	    fun getBeforeOrLastMonths(months: Int): String {
	        val calendar = Calendar.getInstance()
	        calendar.add(Calendar.MONTH, months)
	        val sdf = SimpleDateFormat("yyyyMM", Locale.getDefault())
	        return sdf.format(calendar.time)
	    }
	
	    /**
	     * 获取前后周第一天的日期
	     * @param weeks 增减周数 0为本周
	     */
	    fun getFirstDayOfWeeks(weeks: Int): String {
	        val calendar = Calendar.getInstance()
	
	        // 设置周一为一周的第一天
	        calendar.firstDayOfWeek = Calendar.MONDAY
	        // 设置当前时间为周一
	        calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
	        // 增减周数
	        calendar.add(Calendar.WEEK_OF_YEAR, weeks)
	        // 设置时间为当天的 00:00:00
	        calendar.set(Calendar.HOUR_OF_DAY, 0)
	        calendar.set(Calendar.MINUTE, 0)
	        calendar.set(Calendar.SECOND, 0)
	        calendar.set(Calendar.MILLISECOND, 0)
	
	        // 格式化时间
	        val format = SimpleDateFormat("yyyyMMdd", Locale.getDefault())
	        val formatDate = format.format(calendar.time)
	        Log.d(TAG, "[getFirstDayOfWeeks] weeks: $weeks, time: $formatDate")
	        return formatDate
	    }
	
	    /**
	     * 获取前后几个月的第一天时间戳
	     * @param months 月份数,负数为前几个月,正数为后几个月
	     * @return 时间戳,单位毫秒
	     */
	    fun getFirstDayOfMonths(months: Int): Long {
	        // UTC 时间
	//        val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
	//        val calendar = Calendar.getInstance()
	        // 东八区时间,与 UTC 时间差 8 小时
	        val calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai"))
	        // 设置 1 号为一个月的第一天
	        calendar.set(Calendar.DAY_OF_MONTH, 1)
	        // 向前推 monthsAgo 个月
	        calendar.add(Calendar.MONTH, months)
	        // 设置时间为当天的 00:00:00
	        calendar.set(Calendar.HOUR_OF_DAY, 0)
	        calendar.set(Calendar.MINUTE, 0)
	        calendar.set(Calendar.SECOND, 0)
	        calendar.set(Calendar.MILLISECOND, 0)
	        return calendar.time.time
	    }
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值