Android - 日期类的使用

Android的日期类, Date和Calendar, Date显示, Calendar计算.

处理顺序: String -> Date -> Calendar.

示例实现了几个比较常见的方法:

(1) 日期相隔天数;

(2) 字符串转换Date类;

(3) 获取之前的日期;

(4) 判断是否超过今天等.



代码:

package me.chunyu.Pedometer.manager;

import android.util.Pair;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

import me.chunyu.Pedometer.database.counter.DailyData;

/**
 * 日期管理器, 输入日期的格式"yyyy-MM-dd"的字符串数组, 可能不连续.
 * 提取步数, 需要把拥有步数的项提取出来, 未有步数的项至为0.
 * 使用时, 再根据日期进行统计.
 * <p/>
 * Created by wangchenlong on 15/8/17.
 */
public class DateManager {

    private static DateManager sInstance; // 单例
    private final RecordManager mRecordManager; // 数据管理器
    private final SimpleDateFormat sFormatter; // 格式化

    private DateManager() {
        mRecordManager = RecordManager.getInstance();
        sFormatter = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
    }

    public static DateManager getInstance() {
        if (sInstance == null) {
            sInstance = new DateManager();
        }
        return sInstance;
    }

    /**
     * 从RecordManager获取数据, 转换为步数数组, 从当前日期一直至最早日期.
     *
     * @return 步数数组[当前日期, 至, 最早日期]
     */
    public ArrayList<Pair<String, Integer>> getDataDates() {
        String[] days = mRecordManager.getSortedFilenames();
        if (days.length <= 0) {
            return null;
        }

        String firstDay = days[0];
        String lastDay = days[days.length - 1];

        if (isAfterToday(lastDay)) {
            lastDay = sFormatter.format(new Date());
        }

        long n = daysBetweenTwoDates(firstDay, lastDay) + 1;

        ArrayList<Integer> allSteps = new ArrayList<>();
        ArrayList<String> allDays = new ArrayList<>();

        for (int i = 0; i < n; ++i) {
            String perDay = getBeforeDay(lastDay, i);
            DailyData dailyData = mRecordManager.getDailySteps(perDay);
            if (dailyData != null) {
                int[] steps = dailyData.steps;
                int maxStep = steps[steps.length - 1];
                allSteps.add(maxStep);
            } else {
                allSteps.add(0);
            }
            allDays.add(perDay);
        }

        ArrayList<Pair<String, Integer>> totalData = new ArrayList<>();
        for (int i = 0; i < allSteps.size(); ++i) {
            Pair<String, Integer> dateWithStep = Pair.create(allDays.get(i), allSteps.get(i));
            totalData.add(dateWithStep);
        }

        return totalData;
    }

    /**
     * 判断两个日期相隔的天数
     *
     * @param earlyDay 较早的日期
     * @param lateDay  较晚的日期
     * @return 相隔天数
     */
    public long daysBetweenTwoDates(String earlyDay, String lateDay) {
        Date earlyDate = getDateFromStr(earlyDay);
        Date lateDate = getDateFromStr(lateDay);

        Calendar startCalendar = Calendar.getInstance();
        Calendar lateCalendar = Calendar.getInstance();
        startCalendar.setTime(earlyDate);
        lateCalendar.setTime(lateDate);

        long diff = lateCalendar.getTimeInMillis() - startCalendar.getTimeInMillis();

        return diff / (24 * 60 * 60 * 1000);
    }

    /**
     * 把日期字符串转换为Date类
     *
     * @param day 日期字符串
     * @return 日期Data类
     */
    public Date getDateFromStr(String day) {
        Date date;
        try {
            date = sFormatter.parse(day);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
        return date;
    }

    /**
     * 获取之前某天的日期
     *
     * @param day 时间基准
     * @param i   相差天数
     * @return 前几天的日期
     */
    public String getBeforeDay(String day, int i) {
        Date date = getDateFromStr(day);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_YEAR, i * (-1));
        return sFormatter.format(calendar.getTime());
    }

    /**
     * 判断时间是否超过今日
     *
     * @param day 时间
     * @return 是否
     */
    public boolean isAfterToday(String day) {
        Date lateDate = getDateFromStr(day);
        Date todayDate = new Date();
        return lateDate.getTime() > todayDate.getTime();
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-15 21:29:22

Android - 日期类的使用的相关文章

【转载】android 工具类 DateUtil,可以用它方便的进行日期的操作

本文转载自:http://blog.csdn.net/xuduzhoud/article/details/27526177 全部代码如下: DateUtil.java package com.example.tset; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 日期操作工具类. * * @au

android 工具类 DateUtil

提取了一些在开发过程中可能会用到的日期相关的函数作为工具类,供大家参考: /** * 日期操作工具类. * * @author shimiso */ public class DateUtil { private static final String FORMAT = "yyyy-MM-dd HH:mm:ss"; public static Date str2Date(String str) { return str2Date(str, null); } public static

Android日期对话框NumberPicker的用法教程

NumberPicker是Android3.0之后引入的一个控件,NumberPicker 是用于选择一组预定义好数字的控件.比如时间hour的选择只有0-23有效,则可以通过setMinValue和setMaxValue设定. 使用该控件时需注意他的两个listener和一个formatter:一个listener用于监听当前value的变化:一个listener用于监听该控件的scroll状态:formatter用于格式化显示该控件中的value.下面逐一介绍这几个接口: 1.NumberP

日期类 Date

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /* 日期类 Date Calendar 日期格式化类 SimpleDateFormat */ public class Demo3 { public static void main(String[] args) throws ParseException {

day17 包装类、日期类

包装类 作用:1.丰富了基本数据类型只能存放值的问题,还提供了大量的方法或常量. 2.包装类充当了基本数据类型和引用数据类型转换的桥梁. 应用层面:包装类.String.基本数据类型的互相转换. 1.基本数据类型转为String: String str = Integer.toString(10): String str = 10 + "": 2.String转换为基本数据类型: int i = Integer.parseInt(str): 3.基本数据类型和包装类互转换: 语法糖--

利用java日期类生成数据仓库维度表

利用java日期类生成数据仓库维度表 Date类: 最基础的日期时间类,返回一个相对日期的毫秒数.精确到毫秒,但不支持日期的国际化和分时区显示.Date 类从Java 开发包(JDK)1.0 就开始进化,当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年. 这些方法现在遭到了批评并且已经被转移到了Calendar类里去了,这种改进旨在更好的处理日期数据的国际化格式. Calender类: 相对于Date更加强大的时间类,是抽象类,提供了常规的日期修改功能和国际化

android 小说类源码制作教程源码下载

自己闲着没事制作了个小说软件用来自己看全本/连载小说, 翻页,字体大小,目录,自动更新 具体效果如下:奉献给大家下载查看... 下载APK效果查看地址: http://yun.baidu.com/s/1gdknYyJ 源码下载地址: http://download.csdn.net/detail/ainibaifenbai/7575817 android 小说类源码制作教程源码下载,布布扣,bubuko.com

Problem B: 时间和日期类(III)

Problem B: 时间和日期类(III) Time Limit: 4 Sec  Memory Limit: 128 MBSubmit: 2889  Solved: 1732[Submit][Status][Web Board] Description 设计一个日期时间类,用于读取输入的数据,按格式输出日期和时间. 设计日期时间类DateTime由2个成员组成,分别是一个Date类对象和一个Time类对象: 设计DateTime类需支持以下操作: DateTime::DateTime()无参构

Java:日历类、日期类、数学类、运行时类、随机类、系统类

一:Calendar类 java.util 抽象类Calendar   1.static Calendar getInstance()使用默认时区和语言环境获得一个日历. 2. int get(int field) 返回给定日历字段的值. java.lang.Object 继承者 java.util.Calendar 所有已实现的接口: Serializable, Cloneable, Comparable<Calendar> 直接已知子类: GregorianCalendar 对于日期字段: