在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
}
}