一、充分利用SimpleDateFormat
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateTestUtil {
public static void main(String[] args) throws Exception {
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
String str="20110823";
Date dt=sdf.parse(str);
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(dt);
rightNow.add(Calendar.YEAR,-1);//日期减1年
rightNow.add(Calendar.MONTH,3);//日期加3个月
rightNow.add(Calendar.DAY_OF_YEAR,10);//日期加10天
Date dt1=rightNow.getTime();
String reStr = sdf.format(dt1);
System.out.println(reStr);
}
}
注:在Calendar对象的add方法中,第二个参数为正数表示“加”,负数表示“减”。
二、java date 日期加减天数
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTest {
public static void main(String[] arg){
Date now = new Date();
addAndSubtractDaysByGetTime(now,-5);
addAndSubtractDaysByGetTime(now,5);
addAndSubtractDaysByCalendar(now,-5);
addAndSubtractDaysByCalendar(now,5);
}
public static Date addAndSubtractDaysByGetTime(Date dateTime/*待处理的日期*/,int n/*加减天数*/){
//日期格式
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat dd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(df.format(new Date(dateTime.getTime() + n * 24 * 60 * 60 * 1000L)));
//System.out.println(dd.format(new Date(dateTime.getTime() + n * 24 * 60 * 60 * 1000L)));
//注意这里一定要转换成Long类型,要不n超过25时会出现范围溢出,从而得不到想要的日期值
return new Date(dateTime.getTime() + n * 24 * 60 * 60 * 1000L);
}
public static Date addAndSubtractDaysByCalendar(Date dateTime/*待处理的日期*/,int n/*加减天数*/){
//日期格式
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat dd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Calendar calstart = java.util.Calendar.getInstance();
calstart.setTime(dateTime);
calstart.add(java.util.Calendar.DAY_OF_WEEK, n);
System.out.println(df.format(calstart.getTime()));
//System.out.println(dd.format(calstart.getTime()));
return calstart.getTime();
}
}
不推荐这个,代码不够简洁,看着不爽。
三、网上找的别人的,太长,没看,粘过来先
package com.data.utils;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateFormat {
/**
* 日期减几年
*/
public static String dateMinusYear(String str) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
Date dt = sdf.parse(str);
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(dt);
rightNow.add(Calendar.YEAR, -1);// 日期减1年
Date dt1 = rightNow.getTime();
String reStr = sdf.format(dt1);
return reStr;
}
/**
* 日期加几年
*/
public static String dateAddYear(String str) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
Date dt = sdf.parse(str);
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(dt);
rightNow.add(Calendar.YEAR, 1);// 日期加1年
Date dt1 = rightNow.getTime();
String reStr = sdf.format(dt1);
return reStr;
}
/**
* 日期减几月
*/
public static String dateMinusMonth(String str) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
Date dt = sdf.parse(str);//将字符串生成Date
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(dt);//使用给定的 Date 设置此 Calendar 的时间。
rightNow.add(Calendar.MONTH, -1);// 日期减1个月
Date dt1 = rightNow.getTime();//返回一个表示此 Calendar 时间值的 Date 对象。
String reStr = sdf.format(dt1);//将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer。
return reStr;
}
/**
* 日期加几月
*/
public static String dateAddMonth(String str) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
Date dt = sdf.parse(str);
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(dt);
rightNow.add(Calendar.MONTH, 1);// 日期加3个月
// rightNow.add(Calendar.DAY_OF_YEAR,10);//日期加10天
Date dt1 = rightNow.getTime();
String reStr = sdf.format(dt1);
return reStr;
}
/**
* 获取当前年月的第一个月的str
* @param str
* 201505
* @return 201501
* @throws Exception
*/
public static String dateOneMonth(String str) {
str = str.substring(0, str.length() - 2);
str = str + "01";
return str;
}
/**
* 算出所选月份距离一月份有几个月。
* @param str 201509
* @return 9
*/
public static int dateDistanceMonth(String str) {
int i = Integer.parseInt(str);
int j = Integer.parseInt(DateFormat.dateOneMonth(str));
System.out.println(i - j);
return i - j + 1;
}
/**
* 获取两个时间的时间差,精确到毫秒
* @param str
* @return
*/
public static String TimeDifference(long start, long end) {
long between = end - start;
long day = between / (24 * 60 * 60 * 1000);
long hour = (between / (60 * 60 * 1000) - day * 24);
long min = ((between / (60 * 1000)) - day * 24 * 60 - hour * 60);
long s = (between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
long ms = (between - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000
- min * 60 * 1000 - s * 1000);
String timeDifference = day + "天" + hour + "小时" + min + "分" + s + "秒" + ms
+ "毫秒";
return timeDifference;
}
}
/**
* 获取24小时、一周、一个月的起始时间
*
* @param timeInterval
* : DAY_TIME_INTERVAL WEEK_TIME_INTERVAL MONTH_TIME_INTERVAL
* @return "yyyy-mm-dd hh:mm:ss"
*/
public static String getStartTime(int timeInterval) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (DAY_TIME_INTERVAL == timeInterval) {// 获取24小时的起始时间
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
String startTime = sdf.format(cal.getTime());
return startTime;
} else if (WEEK_TIME_INTERVAL == timeInterval) {
int weekday = cal.get(Calendar.DAY_OF_WEEK) - 1;
cal.add(Calendar.DATE, -weekday);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
String startTime = sdf.format(cal.getTime());
return startTime;
} else if (MONTH_TIME_INTERVAL == timeInterval) {
int dayofmonthMin = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
// c.add(Calendar.DATE, -dayofmonth);
cal.set(Calendar.DATE, dayofmonthMin);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
String startTime = sdf.format(cal.getTime());
return startTime;
}
return null;
}
/**
* 获取24小时、一周、一个月的结束时间
*
* @param timeInterval
* : DAY_TIME_INTERVAL WEEK_TIME_INTERVAL MONTH_TIME_INTERVAL
* @return "yyyy-mm-dd hh:mm:ss"
*/
public static String getEndTime(int timeInterval) {
Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("GMT+8"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (DAY_TIME_INTERVAL == timeInterval) {
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(12, 59);
cal.set(13, 59);
long date = cal.getTimeInMillis();
String endTime = sdf.format(new Date(date));
return endTime;
} else if (WEEK_TIME_INTERVAL == timeInterval) {
int weekday = cal.get(Calendar.DAY_OF_WEEK) - 1;
cal.add(Calendar.DATE, -weekday);
cal.add(Calendar.DATE, 6);
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(12, 59);
cal.set(13, 59);
long date = cal.getTimeInMillis();
String endTime = sdf.format(new Date(date));
return endTime;
} else if (MONTH_TIME_INTERVAL == timeInterval) {
int dayOfMonthMax = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
cal.set(Calendar.DATE, dayOfMonthMax);
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
String endTime = sdf.format(cal.getTime());
return endTime;
}
return null;
}
/**
* 判断dateStr是否在start和end中间,start和end都可以为null yyyyMMddHHmmss或者yyyyMMdd格式
*
* @author you.xu
* @date 2015年8月19日下午3:11:46
* @param dateStr
* @param start
* @param end
* @return
*/
public static boolean checkDateVal(String dateStr, String start, String end) {
boolean isDateRight = false;
Date date = null;
Date startDate = null;
Date endDate = null;
SimpleDateFormat sdf = null;
// 判断日期格式
if (14 == dateStr.length()) {
sdf = new SimpleDateFormat("yyyyMMddHHmmss");
} else if (8 == dateStr.length()) {
sdf = new SimpleDateFormat("yyyyMMdd");
} else
return false;
try {
// 更改判断日期格式
date = sdf.parse(dateStr);
} catch (ParseException e) {
log.error(e, e);
}
if ((start == null) && (end != null)) {
try {
endDate = sdf.parse(end);
} catch (ParseException ex1) {
log.error(ex1, ex1);
}
if ((date != null) && (endDate != null))// Check parameters for
{
if (date.compareTo(endDate) <= 0)
isDateRight = true;
}
} else if ((start != null) && (end == null)) {
try {
startDate = sdf.parse(start);
} catch (ParseException ex1) {
log.error(ex1, ex1);
}
if ((date != null) && (startDate != null)) {
if (date.compareTo(startDate) >= 0)
isDateRight = true;
}
} else if ((start != null) && (end != null)) {
try {
startDate = sdf.parse(start);
endDate = sdf.parse(end);
} catch (ParseException ex2) {
System.out.println(ex2.toString());
}
if ((startDate != null) && (date != null) && (endDate != null)) {
if ((date.compareTo(startDate) >= 0)
&& (date.compareTo(endDate) <= 0))
isDateRight = true;
}
}
return isDateRight;
}
/**
* 判断dateStr是否在start和end中间,start和end都可以为null long形格式
*
* @author you.xu
* @date 2015年8月19日下午3:12:35
* @param dateStr
* @param start
* @param end
* @return
*/
public static boolean checkDateV(String dateStr, String start, String end) {
boolean isDateRight = false;
long date = -1;
long fromDate = -1;
long toDate = -1;
date = java.lang.Long.parseLong(dateStr);
if ((start == null) && (end == null)) {
isDateRight = true;
} else if ((start == null) && (end != null)) {
try {
toDate = java.lang.Long.parseLong(end);
} catch (NumberFormatException nfe) {
log.error(nfe, nfe);
}
if (date <= toDate) {
isDateRight = true;
}
} else if ((start != null) && (end == null)) {
try {
fromDate = java.lang.Long.parseLong(start);
} catch (NumberFormatException nfe) {
log.error(nfe, nfe);
}
if (date >= fromDate) {
isDateRight = true;
}
} else if ((start != null) && (end != null)) {
try {
toDate = java.lang.Long.parseLong(end);
fromDate = java.lang.Long.parseLong(start);
} catch (NumberFormatException nfe) {
log.error(nfe, nfe);
}
if ((date <= toDate) && (date >= fromDate)) {
isDateRight = true;
}
}
return isDateRight;
}
四、自己的方法的,简单说下需求,由于数据库里的存储类型是 “2017-07-04 12:00:00”,要按当前时间向前检索传进来的天数(noTradeDays),利用java.util的GregorianCalendar,结合SimpleDateFormat,完成当前时间逆推的需求
/**
* add by lee 2017/7/4
* 连续n天无交易
*/
if (!StringUtils.isEmpty(noTradeDays)) {
**SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
GregorianCalendar gc=new GregorianCalendar();
gc.setTime(new Date());
gc.add(5, -Integer.parseInt(noTradeDays));**
String cardSql="select posid from card where usetime between "+"'"+sdf.format(gc.getTime())+"'"+" and "+"'"+sdf.format(new Date())+"'"+" group by posid";
List<Card> cards = CardService.cardDAO.executeQuery(new Query(cardSql));
if (cards.size()>0) {
StringBuffer sb=new StringBuffer();
for (Card posId : cards) {
if (!StringUtils.isEmpty(posId.getPosid())) {
sb.append("'").append(posId.getPosid()).append("'").append(",");
}
}
if (sb.length()>0) {
sql_add +=" and posid not in ("+sb.substring(0, sb.length()-1).toString()+")";
}
}
}
恩,就是这样子了,总之就是灵活运用java.util里关于日期的相关类。
文章浏览阅读1.9k次,点赞7次,收藏8次。资源限制时间限制:1.0s 内存限制:256.0MB问题描述 一个8×8的棋盘上有一个马初始位置为(a,b),他想跳到(c,d),问是否可以?如果可以,最少要跳几步?输入格式 一行四个数字a,b,c,d。输出格式 如果跳不到,输出-1;否则输出最少跳到的步数。样例输入1 1 2 3样例输出1数据规模和约定 0<a,b,c,d≤8且都是整数。分析:马走日问题,非常的经典,并且我参考了类似的题目,代码思路都是一样的,我没找出我的原因在哪。.
文章浏览阅读81次。API_二进制恋爱求和运算
文章浏览阅读313次。设计模式概念简单来说,设计模式就是在解决某一类问题时,有既定的优秀的代码框架可以用,优点如下:代码易于维护; 能够做到软件设计的开-闭原则(对修改关闭,对扩展开放); 合理的设计模式,能够做到软件设计的高内聚,低耦合。工厂模式分类简单工厂 Simple Factory 工厂方法 Factory Method 抽象工厂 Abstract Factory针对以上三种模式,先给出结论如下:简单工厂不符合软件设计的开-闭原则,由此改进产生工厂方法 工...
文章浏览阅读587次。围绕Android的一些技术知识点~
文章浏览阅读698次。ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构本文翻译自ResNet, AlexNet, VGG, Inception: Understanding various architectures of Convolutional Networks,原作者保留版权卷积神经网络在视觉识别任务上的表现令人称奇。好的CNN网络是带有上百万参数和许..._vgg16存在残差网络吗
文章浏览阅读712次,点赞9次,收藏14次。Java常用类所讲内容:APIScanner类Random类ArrayList类String类Arrays类Math类Date类第1章 API概述API(Application Programming Interface),应用程序编程接口。Java API是一本程序员的 字典 ,是JDK中提供给我们使用的类的说明文档。这些类将底层的代码实现封装了起来,我们不需要关心这些类...
文章浏览阅读3.8k次。基于simulink的调制器仿真设计与fpga实现(1)调频或调幅时的载波频率为1-2MHz可调,且能通过按键自由调整。(2)可选择内部的调制信号或外部输入的调制信号进行调制,内部产生的调制信号频率在100Hz-10KHz间连续可调。(3)内部产生的100Hz-10KHz调制信号可以为正弦波、三角波、方波、锯齿波,并且可向外输出。用MATLAB/DSP Builder、VHDL语言来设计ID:69500617549380727技术宅男..._simulink开关频率怎么设置
文章浏览阅读440次。标题:啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。 注意:答案是一个整数。请通过浏览器提交答案。 不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。______________________
文章浏览阅读6.9k次。Linux系统中的线程间通信方式主要以下几种:* 锁机制:包括互斥锁、条件变量、读写锁和自旋锁。 互斥锁确保同一时间只能有一个线程访问共享资源。当锁被占用时试图对其加锁的线程都进入阻塞状态(释放CPU资源使其由运行状态进入等待状态)。当锁释放时哪个等待线程能获得该锁取决于内核的调度。 读写锁当以写模式加锁而处于写状态时任何试图加锁的线程(不论是读或写)都阻塞_linux 线程间通信事件
文章浏览阅读3.1w次,点赞4次,收藏8次。启动SQL Server Agent服务(开机启动) 方法一、在命令提示符下,输入下列命令之一:net start "SQL Server Agent (MSSQLSERVER)" (这个无法使用)- 或 -net start SQLSERVERAGENT ( 我是用这个启动的)方法二、_sqlserver2012agent
文章浏览阅读2.9k次,点赞2次,收藏9次。前言Pyecharts支持最小粒度到城市级别的数据,但如果想画某个城市各区的地图,就没办法直接使用了。这里提供一个网站,是阿里开源的,最小粒度到区县界别http://datav.aliyun.com/tools/atlas/,在左侧窗口中提供了API,当然也可以直接选择复制或者下载geojson。有了geojson数据便可以在Pyecharts中使用了。如果以上还不能满足需求,可以通过http://geojson.io/网站自己去绘制地图,过程会比较繁琐,绘制完成后右侧即为你需要geojson数_【pyecharts50例】添加自定义地图/geojson使用/区县地图
文章浏览阅读8.6k次,点赞70次,收藏92次。递进学习策略梯度:从 Gradient、Policy Gradient (REINFORCE、Q Actor-Critic、Advantage Actor-Critic ) 至 Natural Policy Gradient、TRPO、PPO 。逻辑清晰,含大量手写笔记,注释了黎曼流形、Hessian矩阵等30余个数学概念_策略梯度 优势函数