Java日期相关操作

标签: Java 分类: Java 创建时间:2019-04-19 02:28:37 更新时间:2024-11-15 10:49:43

Java中操作日期的主要是Date和Calendar类。

1.获取当前时间的前几天几个小时几周或者几个月

1
2
3
4
5
6
7
8
9
10
11
12
13
Date dNow = new Date();   //当前时间
Date dBefore = new Date();
Calendar calendar = Calendar.getInstance(); //得到日历
calendar.setTime(dNow);//把当前时间赋给日历
calendar.add(Calendar.HOUR_OF_DAY, -24); //
calendar.add(Calendar.DAY_OF_MONTH, -3); //设置为前3天
calendar.add(Calendar.WEEK_OF_MONTH, -1); //设置为前一周
calendar.add(Calendar.MONTH, -1); //设置为前1月
calendar.add(Calendar.MONTH, -3); //设置为前3月
dBefore = calendar.getTime(); //得到前3月的时间
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置时间格式
String startTimeStr = sdf.format(dBefore); //格式化前3月的时间
String endTimeStr= sdf.format(dNow); //格式化当前时间

2.判断当前时间是否在规定时间内

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//判断时间是否在规定的6点到22点之内
public boolean isBelong(){

SimpleDateFormat df = new SimpleDateFormat("HH:mm");//设置日期格式
Date now =null;
Date beginTime = null;
Date endTime = null;
try {
now = df.parse(df.format(new Date()));
beginTime = df.parse("06:00");
endTime = df.parse("22:00");
} catch (Exception e) {
e.printStackTrace();
}

Boolean flag = belongCalendar(now, beginTime, endTime);
return flag;
}
参考文章:
1.Calendar.HOUR_OF_DAY 和 Calendar.HOUR区别:https://blog.csdn.net/lmh820822/article/details/77863425
2.java获取三个月之前时间与当前时间:https://blog.csdn.net/koso10201/article/details/73188170
3.ava 中Calendar的使用:https://takeme.iteye.com/blog/1678236

3.格式化日期函数

我有字符串:2010-02-01 02:22,我想格式化成:2010-02-01 02:22:00这种形式,或者是:2010-02-01 02字符串格式化成:2010-02-01 02:00:00这种形式,查询的资料都是这种形式,将日期格式话。问题是我不能全部定义要转换的格式啊,如果我的时间字符串是其他的类型(yyyy年MM月dd日 HH:mm:ss),像格式话成”yyyy-MM-dd HH:mm:ss“这样的呢。如果有类似于javascript中的moment.js这种库就好了。

1
2
3
4
5
6
7
8
9
10
11
12
public static String formatDateTime(String dataStr){
String pattern = "yyyy-MM-dd HH:mm:ss"; //按照上面的日期格式定义模板,这个一定要完全和上面的一样,否则转换不正确
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
try {
Date date = dateFormat.parse(dataStr); //解析成Date类型
dataStr=dateFormat.format(date);
} catch (ParseException e) {
System.err.println("解析错误");

}
return dataStr;
}

参考资料5中有部分代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.regex.Pattern;

public class ApiUtis {
private static HashMap<String,String> dateRegFormat;
static {
dateRegFormat = new HashMap<String, String>();
dateRegFormat.put("^\\d{4}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D*$",
"yyyy-MM-dd-HH-mm-ss");//2014年3月12日13时5分34秒,2014-03-12 12:05:34,2014/3/12 12:5:34
dateRegFormat.put("^\\d{4}\\D+\\d{2}\\D+\\d{2}\\D+\\d{2}\\D+\\d{2}$","yyyy-MM-dd-HH-mm");//2014-03-12 12:05
dateRegFormat.put("^\\d{4}\\D+\\d{2}\\D+\\d{2}\\D+\\d{2}$","yyyy-MM-dd-HH");//2014-03-12 12
dateRegFormat.put("^\\d{4}\\D+\\d{2}\\D+\\d{2}$","yyyy-MM-dd");//2014-03-12
dateRegFormat.put("^\\d{4}\\D+\\d{2}$","yyyy-MM");//2014-03
dateRegFormat.put("^\\d{4}$","yyyy");//2014
dateRegFormat.put("^\\d{14}$","yyyyMMddHHmmss");//20140312120534
dateRegFormat.put("^\\d{12}$","yyyyMMddHHmm");//201403121205
dateRegFormat.put("^\\d{10}$","yyyyMMddHH");//2014031212
dateRegFormat.put("^\\d{8}$","yyyyMMdd");//20140312
dateRegFormat.put("^\\d{6}$","yyyyMM");//201403
dateRegFormat.put("^\\d{2}\\s*:\\s*\\d{2}\\s*:\\s*\\d{2}$","yyyy-MM-dd-HH-mm-ss");//13:05:34 拼接当前日期
dateRegFormat.put("^\\d{2}\\s*:\\s*\\d{2}$","yyyy-MM-dd-HH-mm");//13:05 拼接当前日期
dateRegFormat.put("^\\d{2}\\D+\\d{1,2}\\D+\\d{1,2}$","yy-MM-dd");//14.10.18(年.月.日)
dateRegFormat.put("^\\d{1,2}\\D+\\d{1,2}$","yyyy-dd-MM");//30.12(日.月) 拼接当前年份
dateRegFormat.put("^\\d{1,2}\\D+\\d{1,2}\\D+\\d{4}$","dd-MM-yyyy");//12.21.2013(日.月.年)
}
@SuppressWarnings("finally")
public static String FormatDate(String dateStr){
String curDate =new SimpleDateFormat("yyyy-MM-dd").format(new Date());
DateFormat formatter1 =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
DateFormat formatter2;
String dateReplace;
String strSuccess="";
try{
for(String key : dateRegFormat.keySet()) {
if(Pattern.compile(key).matcher(dateStr).matches()) {
formatter2= new SimpleDateFormat(dateRegFormat.get(key));
if(key.equals("^\\d{2}\\s*:\\s*\\d{2}\\s*:\\s*\\d{2}$")||key.equals("^\\d{2}\\s*:\\s*\\d{2}$")){
//13:05:34 或 13:05 拼接当前日期
dateStr= curDate + "-"+ dateStr;
}else if(key.equals("^\\d{1,2}\\D+\\d{1,2}$")){
//21.1(日.月) 拼接当前年份
dateStr = curDate.substring(0,4)+ "-"+ dateStr;
}
dateReplace= dateStr.replaceAll("\\D+","-");
// System.out.println(dateRegExpArr[i]);
strSuccess= formatter1.format(formatter2.parse(dateReplace));
break;
}
}
}catch(Exception e) {
System.err.println("-----------------日期格式无效:"+dateStr);
throw new Exception( "日期格式无效");
}
finally{
return strSuccess;
}
}
}
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。