观心静

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

基于Android一些时间创建的基本概念

获取当前时间

方式一:

Date date = new Date();
Log.e(TAG, "当前时间="+date);

结果:

E/TimeActivity: 当前时间=Wed Sep 12 07:03:25 GMT+00:00 2018

方式二:

long date = System.currentTimeMillis(); //获得系统时间,得到是从1970年到现在的毫秒级long值
Log.e(TAG, "毫秒级time值=:"+date);

 结果:

E/TimeActivity: 毫秒级time值=:1536736055737

 方法三:

Calendar calendar = Calendar.getInstance();
calendar.getTimeInMillis();

获取设备开机至此时的相对时间

long time = SystemClock.elapsedRealtime();

获取休眠唤醒后到此时的相对时间

SystemClock.uptimeMillis();

设置系统与获取时间格式

设置时间格式需要系统APP权限

    public static boolean is24HourMode(Context context) {
        return android.text.format.DateFormat.is24HourFormat(context);
    }
    
    public static void setHourMode(Context context, boolean is24HourMode) {
        android.provider.Settings.System.putString(context.getContentResolver(),
            android.provider.Settings.System.TIME_12_24, is24HourMode ? "24": "12");
    }

设置系统时间

需要系统级别的权限  android.permission.SET_TIME

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.setTime(millis);

SimpleDateFormat  格式化时间

格式化字母表

Symbol Meaning Presentation Example
G era designator 时代 Text AD
y year   Number 2009
M month in year  Text & Number July & 07
d day in month  Number 10
h hour in am/pm (1-12) 12小时制的时 Number 12
H hour in day (0-23)  24小时制的时 Number 0
m minute in hour   分钟 Number 30
s second in minute Number 55
S millisecond 毫秒 Number 978
E day in week 星期 Text Tuesday
D day in year  一年中的第几天 Number 189
F day of week in month  一个月中的第几周的星期几 Number 2 (2nd Wed in July)
w week in year  一年中的第几周 Number 27
W week in month 一月中的第几周 Number 2
a am/pm marker  上午/下午 Text PM
k hour in day (1-24)   一天中的第几个小时 Number 24
K hour in am/pm (0-11)  Number 0
z time zone 时区 Text Pacific Standard Time
' escape for text Delimiter (none)
' single quote Literal '

 

字符串转时间戳

String str = "2019-03-13 13:54:00"; 
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse(str); 
long ts = date.getTime(); System.out.println(ts);

时间戳转字符串

格式化出全部的时间:

long time = System.currentTimeMillis();
//格式化 日-月(3个M等于文本形式的月份)-年  小时:分钟:秒:毫秒
SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss:SSS");
String timeText = formatter.format(time);
Log.e(TAG, "格式化后time值=:"+timeText);

结果:

E/TimeActivity: 格式化后time值=:12-Sep-2018 07:22:38:596

只格式化时-分-秒-毫秒:

SimpleDateFormat formatter = new SimpleDateFormat("HH-mm-ss-SSS");//分隔符是可以自己设定的
Log.e(TAG, "格式化后time值=:"+formatter.format(System.currentTimeMillis()));

结果:

E/TimeActivity: 格式化后time值=:07-29-18-317

格式化一个月中第几周:

SimpleDateFormat formatter = new SimpleDateFormat("M-W");//月份-月份中的第几周
//如果是"MM-WW" 则可以格式化出 09-03
Log.e(TAG, "格式化后time值=:"+formatter.format(System.currentTimeMillis()));

结果:

E/TimeActivity: 格式化后time值=:9-3

Calendar 历法类

例一:

                mFormat = new SimpleDateFormat("yyyy-MM-dd:HH-mm-ss");
                Calendar calendar = Calendar.getInstance();//得到单例
                calendar.set(Calendar.YEAR,2018);//年
                calendar.set(Calendar.MONTH,8);//月 注意月份是从0开始计算的,所以这里的8,在格式化后等于9
                calendar.set(Calendar.DAY_OF_MONTH,12);//日
                calendar.set(Calendar.HOUR_OF_DAY,15);// HOUR_OF_DAY 24小时制的时
                calendar.set(Calendar.MINUTE,52);//分
                calendar.set(Calendar.SECOND,20);//秒
                Log.e(TAG, "未格式化毫秒级time="+calendar.getTimeInMillis());
                Log.e(TAG, "手动格式化time="+mFormat.format(calendar.getTimeInMillis()));
                Log.e(TAG, "系统自带格式化time="+calendar.getTime());

效果:

 E/TimeActivity: 未格式化毫秒级time=1536767540133
 E/TimeActivity: 手动格式化time=2018-09-12:15-52-20
 E/TimeActivity: 系统自带格式化time=Wed Sep 12 15:52:20 GMT+00:00 2018

例二:

calendar.set(2017,9,13,14,24,30);
Log.e(TAG, "另一种方式输入方式time="+mFormat.format(calendar.getTimeInMillis()));

效果 :

E/TimeActivity: 另一种方式输入方式time=2017-10-13:14-24-30

例三:

                calendar.set(Calendar.AM_PM,0);// 0=上午  1=下午
                calendar.set(Calendar.HOUR,6);//12小时值
                Log.e(TAG, "上午time="+mFormat.format(calendar.getTimeInMillis()));
                calendar.set(Calendar.AM_PM,1);
                calendar.set(Calendar.HOUR,7);
                Log.e(TAG, "下午time="+mFormat.format(calendar.getTimeInMillis()));

效果:

 E/TimeActivity: 上午time=2017-10-13:06-24-30
 E/TimeActivity: 下午time=2017-10-13:19-24-30

使用Calendar向上或向下跳转年/月/日/时/分/秒

日期的切换还相当简单只需要当前时间戳减去24小时时间戳,年份或月份的切换是需要相当复杂的计算的,需要计算大小月/平润年.好在Calendar类已经帮我们实现了这个方法

add()方法:

  说明一下add()方法,使用add()方法切换时间,会影响到其他区域的时间(增加减少日期的同时会改变月份或者年份),例如:2018-11-31(这里是11等于12),我们切换增加一天时间就会变成2019-0-1

     Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.YEAR,-1);//减少一年
        calendar.add(Calendar.YEAR,1);//增加一年
        calendar.add(Calendar.MONTH,-1);//减少一个月
        calendar.add(Calendar.MONTH,1);//增加一个月
        calendar.add(Calendar.DAY_OF_MONTH,-1);//减少一天
        calendar.add(Calendar.DAY_OF_MONTH,1);//增加一天

roll()方法:

    roll()方法正好与add()相反,使用roll()方法切换时间,不会影响到其他区域的时间,例如:2018-11-31,我们切换增加一天时间就会变成2018-11-1

        Calendar calendar = Calendar.getInstance();
        calendar.roll(Calendar.YEAR,-1);//减少一年
        calendar.roll(Calendar.YEAR,1);//增加一年
        calendar.roll(Calendar.MONTH,-1);//减少一个月
        calendar.roll(Calendar.MONTH,1);//增加一个月
        calendar.roll(Calendar.DAY_OF_MONTH,-2);//减少2天
        calendar.roll(Calendar.DAY_OF_MONTH,2);//增加2天
        //当然也可以使用布尔值
        calendar.roll(Calendar.YEAR,true);//减少一年
        calendar.roll(Calendar.YEAR,false);//增加一年
        calendar.roll(Calendar.MONTH,true);//减少一个月
        calendar.roll(Calendar.MONTH,false);//增加一个月
        calendar.roll(Calendar.DAY_OF_MONTH,true);//减少一天
        calendar.roll(Calendar.DAY_OF_MONTH,false);//增加一天 

使用Calendar得到时间

Calendar cal = Calendar.getInstance();
                //当前年
                int year = cal.get(Calendar.YEAR);
                Log.e(TAG, "当前年:"+year);
                //当前月
                int month = (cal.get(Calendar.MONTH))+1;
                Log.e(TAG, "当前月:"+month);
                //当前月的第几天:即当前日
                int day_of_month = cal.get(Calendar.DAY_OF_MONTH);
                Log.e(TAG, "当前月:"+day_of_month);
                //当前时:HOUR_OF_DAY-24小时制;HOUR-12小时制
                int hour = cal.get(Calendar.HOUR_OF_DAY);
                Log.e(TAG, "当前时:"+hour);
                //当前分
                int minute = cal.get(Calendar.MINUTE);
                Log.e(TAG, "当前分:"+minute);
                //当前秒
                int second = cal.get(Calendar.SECOND);
                Log.e(TAG, "当前秒:"+second);
                //当前毫秒
       int millisecond = calendar.get(Calendar.MILLISECOND);
                Log.e(TAG, "当前毫秒:"+millisecond);
                //0-上午;1-下午
                int ampm = cal.get(Calendar.AM_PM);
                Log.e(TAG, "上午/下午:"+ampm);
                //当前年的第几周
                int week_of_year = cal.get(Calendar.WEEK_OF_YEAR);
                Log.e(TAG, "当前年的第几周:"+week_of_year);
                //当前月的第几周
                int week_of_month = cal.get(Calendar.WEEK_OF_MONTH);
                Log.e(TAG, "当前月的第几周:"+week_of_month);
                //当前年的第几天
                int day_of_year = cal.get(Calendar.DAY_OF_YEAR);
                Log.e(TAG, "当前年的第几天:"+day_of_year);        

另外解释为什么int month = (cal.get(Calendar.MONTH))+1; 需要加+1,因为这个获取的月份值是从0开始的

注意!如果你发现你获取的年份、月份、日期、小时等等不准确时请确定你的时区是否设置正确。

 

个人实现的时间工具类


import android.util.Pair;
import java.util.Calendar;
import java.util.Date;

/**
 * 时间工具类
 */
public class TimeUtil {


    /**
     * 获取一天的开始时间戳与结束时间戳
     *
     * @param timestamp
     * @return Pair<开始时间, 结束时间>
     */
    public static Pair<Long, Long> getDayStartTimeAndEndTime(long timestamp) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(timestamp);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 1);
        long startTime = calendar.getTimeInMillis();
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        long endTime = calendar.getTimeInMillis();
        return new Pair<>(startTime, endTime);
    }

    /**
     * 获取一天的开始时间戳与结束时间戳
     *
     * @param year  年
     * @param month 月(0-11)
     * @param day   日
     * @return Pair<开始时间, 结束时间>
     */
    public static Pair<Long, Long> getDayStartTimeAndEndTime(int year, int month, int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month, day);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 1);
        long startTime = calendar.getTimeInMillis();
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        long endTime = calendar.getTimeInMillis();
        return new Pair<>(startTime, endTime);
    }

    /**
     * 得到今天0点时间戳
     *
     * @return
     */
    public static long todayZeroTime() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTimeInMillis();
    }

    /**
     * 目标时间戳的0点时间戳
     *
     * @param time
     * @return
     */
    public static long targetZeroTime(long time) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(time);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTimeInMillis();

    }

    /**
     * 判断是不是今天
     *
     * @param time 需要判断的时间戳
     * @return
     */
    public static boolean isToday(long time) {
        if (todayZeroTime() == targetZeroTime(time)) {
            return true;
        }
        return false;
    }

    /**
     * 判断是不是昨天
     *
     * @param time 需要判断的时间戳
     * @return
     */
    public static boolean isYesterday(long time) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        if (targetZeroTime(calendar.getTimeInMillis()) == targetZeroTime(time)) {
            return true;
        }
        return false;
    }

    /**
     * 时间段是否相等
     *
     * @return
     */
    public static int isSameTime(String hour, String minute, String endHour, String endMinute) {
        Calendar startCal = Calendar.getInstance();
        startCal.setTimeInMillis(System.currentTimeMillis());
        startCal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour));
        startCal.set(Calendar.MINUTE, Integer.parseInt(minute));
        Date startCalTime = startCal.getTime();

        Calendar endCal = Calendar.getInstance();
        endCal.setTimeInMillis(System.currentTimeMillis());
        endCal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(endHour));
        endCal.set(Calendar.MINUTE, Integer.parseInt(endMinute));
        Date endCalTime = endCal.getTime();

        return startCalTime.compareTo(endCalTime);
    }

    /**
     * 判断是不是今年
     *
     * @param time 需要判断的时间戳
     * @return
     */
    public static boolean isThisYear(long time) {
        Calendar calendar = Calendar.getInstance();
        int currentYear = calendar.get(Calendar.YEAR);
        calendar.setTimeInMillis(time);
        int targetYear = calendar.get(Calendar.YEAR);
        if (currentYear == targetYear) {
            return true;
        }
        return false;
    }

    /**
     * 时间戳转小时分钟
     *
     * @param timestamp
     * @return
     */
    public static long[] timestampToHourMinute(long timestamp) {
        long oneHour = 60 * 60 * 1000;
        long hour = timestamp / oneHour;
        long minute = (timestamp % oneHour) / (60 * 1000);
        return new long[]{hour, minute};
    }

    /**
     * 时间戳转小时分钟秒
     *
     * @param timestamp
     * @return
     */
    public static long[] timestampToHourMinuteSecond(long timestamp) {
        long oneHour = 60 * 60 * 1000;
        long oneMinute = 60 * 1000;
        long hour = timestamp / oneHour;
        long minute = (timestamp % oneHour) / oneMinute;
        long second = (timestamp % oneMinute) / 1000;
        return new long[]{hour, minute, second};
    }

    /**
     * 时间戳转日期小时分钟
     *
     * @param timestamp
     * @return
     */
    public static long[] timestampToDayHourMinute(long timestamp) {
        long oneHour = 60 * 60 * 1000;
        long oneDay = 24 * oneHour;
        long day = timestamp / oneDay;
        long hour = (timestamp % oneDay) / oneHour;
        long minute = (timestamp % oneHour) / (60 * 1000);
        return new long[]{day, hour, minute};
    }
}

 

 

End

posted on 2019-09-29 15:10  观心静  阅读(4935)  评论(0编辑  收藏  举报