java日期类的计算问题_java日期计算(Calendar类)
昨天学了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类)相关推荐
- java计算时间差_Java中计算两个日期的时间差
这篇文章将使用两个例子计算两个日期的时间差. 1.使用Java SDK. 2.使用Joda库. 1.使用Java SDK 计算两个Date之间的时间差,基本思路为把Date转换为ms(微秒),然后计算 ...
- java格式化时间博客园_Java 日期格式化工具类
importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava. ...
- java计算工作日_Java工作日计算工具类
工作日计算工具类 主要功能:传入两个日期,返回这两个日期之间有多少个工作日. 思路: 预先设置好一定年份范围内的节假日.补休到map里.(这里暂时只设置了2017 - 2018年的) 将这个年份范围内 ...
- java 日期相减得分钟_java日期相减得到分钟??????
1 public class DateUtils extendsPropertyEditorSupport {2 //各种时间格式 3 public static final SimpleDateFo ...
- java new date 减一天_java日期增加一个月或减少一天
我们在java开发中,遇到一个Date类型的日期,希望在它基础上增加一个月,赋值给另外一个变量,这个时候该如何处理 /**** * 传入具体日期 ,返回具体日期增加一个月. * @param date ...
- java 日期计算星座_Java日期时间API系列25-----Jdk8中java.time包中的新的日期时间API类,使用MonthDay计算十二星座。...
packagecom.xkzhangsan.time.enums;import staticcom.xkzhangsan.time.constants.Constant.MONTHDAY_FORMAT ...
- java date 加减一天_java日期加减操作
1.用java.util.Calender来实现 Calendar calendar=Calendar.getInstance(); calendar.setTime(new Date()); Sys ...
- java 当天最晚时间毫秒_java 日期和字符串互转,根据当天整天时间 得到当天最后一秒的日期时间...
java 日期和字符串互转,根据当天整天时间 得到当天最后一秒的日期时间 package com.hi; import java.text.DateFormat; import java.text ...
- java时间格式年月日时分秒_java日期格式(年月日时分秒毫秒)
java日期格式(年月日时分秒毫秒) 2020-08-13 07:09 阅读数 79 package test.remote.tools.combine; import java.text.Simpl ...
最新文章
- 反射,hashlib模块,正则匹配,冒泡,选择,插入排序
- Netty实现原理浅析
- sklearn集合算法预测泰坦尼克号幸存者
- Python从入门到精通:Python装饰器详解
- python的颜色有哪些_Python颜色分类及格式
- 基于java的数据结构学习——数组实现的栈以及简单应用C++实现
- python脚本在linux上运行的两种方式_python脚本当作Linux中的服务启动实现方法
- Mr.J-- HTTP学习笔记(七)-- 缓存
- python从入门到精通pdf-跟老齐学Python:从入门到精通 完整版PDF[7MB]
- 网络工程师 名词解释
- java pdf 文字_Java如何使用Java向PDF页面中添加文本
- 【转】 CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
- 1月第1周业务风控关注 | 四部门联合印发App违法违规收集使用个人信息行为认定方法
- 电脑休眠唤醒后无法显示WIFI列表
- 微信6.0 ActionBar样式
- Stanford Large-Scale 3D Indoor Spaces Dataset (S3DIS)
- 慢慢读《Deep Learning In Natural Language Processing》(一)
- 云蹦迪、云追星、云表白…疫情下的情人节怎么过?
- VS调试出现错误提示 无法将“obj\Debug\*.*”复制到“bin\Debug\*.*”,文件正在由另一个进程使用,因此该进程无法访问此文件
- Lintcode 428. Pow(x, n) (Medium) (Python)
热门文章
- 发布地图服务属性表_Web3D地图来了!腾讯位置服务正式版发布!
- echart单击后获取横坐标值_echart 横坐标倾斜
- mysql安全性实验心得_mysql安全小结
- Python常用模块之subprocess模块
- Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
- python中Dict与OrderedDict
- Python super超类方法
- 计算机服务业纳税,2018年全国软件和信息技术服务业增值税、消费税、营业税等各税收收入情况(附各地区)...
- 什么是posix?(Portable Operating System Interface 便携式操作系统接口)
- linux 中~$和/$的区别?