昨天学了java日期的格式器,主要是用SimpleDateFormat进行格式化、解析。但这还仅停留在日期的查看(调整显示格式)阶段,更重要的是日期的操作。今天继续学习,记录如下:

今天主要学习的日期操作主要是-----获取日期字段(年、月、日、年中的天数、年中的周数等)、计算两个时间的间隔日期(年、月、天)、根据开始时间间隔时间计算结束时间。

关于Calendar日历的字段值,我从JDK中摘抄了一些我认为比较重要的,如下:

常规的年月日时分秒:

static int YEAR

指示年的 get 和 set 的字段数字。

static int MONTH

指示月份的 get 和 set 的字段数字。

static int DATE

get 和 set 的字段数字,指示一个月中的某天。

static int HOUR

get 和 set 的字段数字,指示上午或下午的小时。

static int MINUTE

get 和 set 的字段数字,指示一小时中的分钟

static int SECOND

get 和 set 的字段数字,指示一分钟中的秒。

比较有用的几个字段:

static int DAY_OF_YEAR

get 和 set 的字段数字,指示当前年中的天数。

static int WEEK_OF_YEAR

get 和 set 的字段数字,指示当前年中的星期数。

static int WEEK_OF_MONTH

get 和 set 的字段数字,指示当前月中的星期数。

static int DAY_OF_WEEK

get 和 set 的字段数字,指示一个星期中的某天。

下面是关于日期计算的测试代码,虽然较长,但是调理很清晰。

/**

* 日期类Date、Calendar测试类

*

*/

package com.date_test;

import java.text.DateFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

/**

* @author wkupaochuan

* @time Jun 14, 2012

* @version V 1.0

*

* 实现的接口如下:

* 1---根据开始时间和间隔天数计算结束时间 Date calculateEndDate(Date sDate, int days)

* 2---根据开始时间、结束时间、间隔类型(年、月、日)计算间隔时间 int calInterval(Date sDate, Date eDate, String type)

* 3---输出日历实例(当前时间)的各个字段值 void printFields(Calendar cNow)

* 4---判定某个年份是否是闰年 boolean isLeapYear(int year)

* 5---比较两个日期的大小 int compareDate(Date sDate, Date eDate)

*/

public class Calendar_test {

public static void main(String agrs[])

{

//获取日历实例并赋予当前时间

Calendar cNow = Calendar.getInstance();

cNow.setTime(new Date());

//输出日历相关字段

printFields(cNow);

/*计算两个日期的时间间隔*/

//开始时间

Date sDate = new Date();

//结束时间

try {

Date eDate = (new SimpleDateFormat("yyyy-MM-dd")).parse("2012-05-29");

//计算结果并输出

System.out.println("今天与2020-05-29相隔:" + calInterval(sDate, eDate, "d") + "天");

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

/*计算结束日期并输出*/

SimpleDateFormat df = (SimpleDateFormat)DateFormat.getInstance();

df.applyPattern("yyyy-MM-dd");

System.out.println("从几天开始计算,2天后是:" + df.format(calculateEndDate(sDate, 2)));

}

/**

* 根据起始日期和间隔时间计算结束日期

*

* @param sDate开始时间

*

* @param days间隔时间

*

* @return 结束时间

* */

public static Date calculateEndDate(Date sDate, int days)

{

//将开始时间赋给日历实例

Calendar sCalendar = Calendar.getInstance();

sCalendar.setTime(sDate);

//计算结束时间

sCalendar.add(Calendar.DATE, days);

//返回Date类型结束时间

return sCalendar.getTime();

}

/**

* 计算两个日期的时间间隔

*

* @param sDate开始时间

*

* @param eDate结束时间

*

* @param type间隔类型("Y/y"--年 "M/m"--月 "D/d"--日)

*

* @return interval时间间隔

* */

private static int calInterval(Date sDate, Date eDate, String type)

{

//时间间隔,初始为0

int interval = 0;

/*比较两个日期的大小,如果开始日期更大,则交换两个日期*/

//标志两个日期是否交换过

boolean reversed = false;

if(compareDate(sDate, eDate) > 0)

{

Date dTest = sDate;

sDate = eDate;

eDate = dTest;

//修改交换标志

reversed = true;

}

/*将两个日期赋给日历实例,并获取年、月、日相关字段值*/

Calendar sCalendar = Calendar.getInstance();

sCalendar.setTime(sDate);

int sYears = sCalendar.get(Calendar.YEAR);

int sMonths = sCalendar.get(Calendar.MONTH);

int sDays = sCalendar.get(Calendar.DAY_OF_YEAR);

Calendar eCalendar = Calendar.getInstance();

eCalendar.setTime(eDate);

int eYears = eCalendar.get(Calendar.YEAR);

int eMonths = eCalendar.get(Calendar.MONTH);

int eDays = eCalendar.get(Calendar.DAY_OF_YEAR);

//年

if(cTrim(type).equals("Y") || cTrim(type).equals("y"))

{

interval = eYears - sYears;

if(eMonths < sMonths)

{

--interval;

}

}

//月

else if(cTrim(type).equals("M") || cTrim(type).equals("m"))

{

interval = 12 * (eYears - sYears);

interval += (eMonths - sMonths);

}

//日

else if(cTrim(type).equals("D") || cTrim(type).equals("d"))

{

interval = 365 * (eYears - sYears);

interval += (eDays - sDays);

//除去闰年天数

while(sYears < eYears)

{

if(isLeapYear(sYears))

{

--interval;

}

++sYears;

}

}

//如果开始日期更大,则返回负值

if(reversed)

{

interval = -interval;

}

//返回计算结果

return interval;

}

/**

* 输出日历相关字段(当前日期)

*

* @param cNow当前时间

*

* @return null

*

* 各个字段值都可以用get(field)得到,也可以用set(field, value)函数修改

* */

private static void printFields(Calendar cNow)

{

//先用Date类型输出验证

SimpleDateFormat df = (SimpleDateFormat)DateFormat.getInstance();

df.applyPattern("yyyy-MM-dd HH:mm:ss");

System.out.println("标准日期:" + df.format(new Date()));

//逐个输出相关字段值

System.out.print("年份:" + cNow.get(Calendar.YEAR) + "\t");

//月份有问题(这里的月份开始计数为0)

System.out.print("月份:" + cNow.get(Calendar.MONTH) + "\t");

System.out.print("日期:" + cNow.get(Calendar.DATE) + "\t");

System.out.print("小时:" + cNow.get(Calendar.HOUR) + "\t");

System.out.print("分钟:" + cNow.get(Calendar.MINUTE) + "\t");

System.out.println("秒钟:" + cNow.get(Calendar.SECOND));

//本年的第几天,在计算时间间隔的时候有用

System.out.println("一年中的天数:" + cNow.get(Calendar.DAY_OF_YEAR));

System.out.println("一年中的周数:" + cNow.get(Calendar.WEEK_OF_YEAR));

//即本月的第几周

System.out.println("一月中的周数:" + cNow.get(Calendar.WEEK_OF_MONTH));

//即一周中的第几天(这里是以周日为第一天的)

System.out.println("一周中的天数:" + cNow.get(Calendar.DAY_OF_WEEK));

}

/**

* 判定某个年份是否是闰年

*

* @param year待判定的年份

*

* @return 判定结果

* */

private static boolean isLeapYear(int year)

{

return (year%400 == 0 || (year%4 == 0 && year%100 != 0));

}

/**

*

* 字符串去除两头空格,如果为空,则返回"",如果不空,则返回该字符串去掉前后空格

*

* @param tStr输入字符串

*

* @return 如果为空,则返回"",如果不空,则返回该字符串去掉前后空格

*

*/

public static String cTrim(String tStr)

{

String ttStr = "";

if (tStr == null)

{}

else

{

ttStr = tStr.trim();

}

return ttStr;

}

/**

* 比较两个Date类型的日期大小

*

* @param sDate开始时间

*

* @param eDate结束时间

*

* @return result返回结果(0--相同 1--前者大 2--后者大)

* */

private static int compareDate(Date sDate, Date eDate)

{

int result = 0;

//将开始时间赋给日历实例

Calendar sC = Calendar.getInstance();

sC.setTime(sDate);

//将结束时间赋给日历实例

Calendar eC = Calendar.getInstance();

eC.setTime(eDate);

//比较

result = sC.compareTo(eC);

//返回结果

return result;

}

}

程序执行结果如下:

Calendar的字段操作还有些特殊的地方,比如set()、add()等函数。现在还没搞明白。

java日期类的计算问题_java日期计算(Calendar类)相关推荐

  1. java计算时间差_Java中计算两个日期的时间差

    这篇文章将使用两个例子计算两个日期的时间差. 1.使用Java SDK. 2.使用Joda库. 1.使用Java SDK 计算两个Date之间的时间差,基本思路为把Date转换为ms(微秒),然后计算 ...

  2. java格式化时间博客园_Java 日期格式化工具类

    importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava. ...

  3. java计算工作日_Java工作日计算工具类

    工作日计算工具类 主要功能:传入两个日期,返回这两个日期之间有多少个工作日. 思路: 预先设置好一定年份范围内的节假日.补休到map里.(这里暂时只设置了2017 - 2018年的) 将这个年份范围内 ...

  4. java 日期相减得分钟_java日期相减得到分钟??????

    1 public class DateUtils extendsPropertyEditorSupport {2 //各种时间格式 3 public static final SimpleDateFo ...

  5. java new date 减一天_java日期增加一个月或减少一天

    我们在java开发中,遇到一个Date类型的日期,希望在它基础上增加一个月,赋值给另外一个变量,这个时候该如何处理 /**** * 传入具体日期 ,返回具体日期增加一个月. * @param date ...

  6. java 日期计算星座_Java日期时间API系列25-----Jdk8中java.time包中的新的日期时间API类,使用MonthDay计算十二星座。...

    packagecom.xkzhangsan.time.enums;import staticcom.xkzhangsan.time.constants.Constant.MONTHDAY_FORMAT ...

  7. java date 加减一天_java日期加减操作

    1.用java.util.Calender来实现 Calendar calendar=Calendar.getInstance(); calendar.setTime(new Date()); Sys ...

  8. java 当天最晚时间毫秒_java 日期和字符串互转,根据当天整天时间 得到当天最后一秒的日期时间...

    java 日期和字符串互转,根据当天整天时间   得到当天最后一秒的日期时间 package com.hi; import java.text.DateFormat; import java.text ...

  9. java时间格式年月日时分秒_java日期格式(年月日时分秒毫秒)

    java日期格式(年月日时分秒毫秒) 2020-08-13 07:09 阅读数 79 package test.remote.tools.combine; import java.text.Simpl ...

最新文章

  1. 反射,hashlib模块,正则匹配,冒泡,选择,插入排序
  2. Netty实现原理浅析
  3. sklearn集合算法预测泰坦尼克号幸存者
  4. Python从入门到精通:Python装饰器详解
  5. python的颜色有哪些_Python颜色分类及格式
  6. 基于java的数据结构学习——数组实现的栈以及简单应用C++实现
  7. python脚本在linux上运行的两种方式_python脚本当作Linux中的服务启动实现方法
  8. Mr.J-- HTTP学习笔记(七)-- 缓存
  9. python从入门到精通pdf-跟老齐学Python:从入门到精通 完整版PDF[7MB]
  10. 网络工程师 名词解释
  11. java pdf 文字_Java如何使用Java向PDF页面中添加文本
  12. 【转】 CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
  13. 1月第1周业务风控关注 | 四部门联合印发App违法违规收集使用个人信息行为认定方法
  14. 电脑休眠唤醒后无法显示WIFI列表
  15. 微信6.0 ActionBar样式
  16. Stanford Large-Scale 3D Indoor Spaces Dataset (S3DIS)
  17. 慢慢读《Deep Learning In Natural Language Processing》(一)
  18. 云蹦迪、云追星、云表白…疫情下的情人节怎么过?
  19. VS调试出现错误提示 无法将“obj\Debug\*.*”复制到“bin\Debug\*.*”,文件正在由另一个进程使用,因此该进程无法访问此文件
  20. Lintcode 428. Pow(x, n) (Medium) (Python)

热门文章

  1. 发布地图服务属性表_Web3D地图来了!腾讯位置服务正式版发布!
  2. echart单击后获取横坐标值_echart 横坐标倾斜
  3. mysql安全性实验心得_mysql安全小结
  4. Python常用模块之subprocess模块
  5. Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
  6. python中Dict与OrderedDict
  7. Python super超类方法
  8. 计算机服务业纳税,2018年全国软件和信息技术服务业增值税、消费税、营业税等各税收收入情况(附各地区)...
  9. 什么是posix?(Portable Operating System Interface 便携式操作系统接口)
  10. linux 中~$和/$的区别?