时间类apache.http.client.utils.Dateutils会有时区问题
例如Dateutils的以下方法
public static String formatDate(final Date date, final String pattern) {
Args.notNull(date, "Date");
Args.notNull(pattern, "Pattern");
final SimpleDateFormat formatter = DateFormatHolder.formatFor(pattern);
return formatter.format(date);
}
罪魁祸首是以下这一句:
final SimpleDateFormat formatter = DateFormatHolder.formatFor(pattern);
这一句时调用的格林威治的时区,相对于北京时间来说比北京时间慢8个小时。
假如格林威治时间的2021/06/20 00:00是北京时间的2021/06/20 08:00
这样很明显会有很多问题,
假如在使用日期格式化时只想获取该时间的日期,假如你传的是2021/06/20 08:00,返回回来的是2021/06/20没有问题,但是假如你传的是2021/06/20 07:59,返回来的将会是2021/06/19,因为北京时间的2021/06/20 07:59,在该工具类使用
DateFormatHolder.formatFor(pattern);
时,这行代码使用了格林威治的时区,返回来的时间,将你的北京时间的2021/06/20 07:59转换为格林威治时间的2021/06/19 23:59;
再通过
return formatter.format(date);
返回,得到2021/06/19;经搜索大部分的apache的时间工具类都有类似的问题;所以在企业中应该尽量避免使用apache所提供的时间工具类。
建议企业内自己手写一个时间的工具类,手动创建的SimpleDateFormat就不会有时区的问题,甚至还可以手动设置时区;
像以下代码就会根据系统的时区创建;
//根据系统所在时区
new SimpleDateFormat();
//手动指定时区
new SimpleDateFormat(String pattern, Locale locale);
要格式化可以使用
new SimpleDateFormat("yyyy.MM.dd").format(date);
实现格式化;
说说java.util.Date和java.sql.Date两者之间的一些使用:
从java.sql.Date的名字就可以知道,这是专门用于数据库的,数据库的date类型,只存储日期,不存储时分秒这些时间;
java.util.Date用于平常的一些时间的使用,可以包含时分秒;
java.util.Date和java.sql.Date两者可以互相转换;
来先简单看下以下代码
java.sql.Date date=new java.sql.Date(new java.util.Date().getTime());
java.util.Date date1=date;
java.sql.Date不包含具体的时分秒,但是在这种情况下,将date1存入数据库字段类型为datetime时,数据库里的时分秒毫秒不会是00:00:00.000,而是第一句
java.sql.Date date=new java.sql.Date(new java.util.Date().getTime());
创建时的时间,所以在有时候想要获取某一天的零点零分可不能使用这样的方法,具体获取具体日期的零点零分,网上也有很多种方法,这里我说些与大部分人不一样的方法吧:
第一种(这种比较直接简单,易于理解):
SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd 00:00");
String nowDateStr = format.format(new java.util.Date())
java.util.Date nowDate = format.parse(nowDateStr);
第二种(这个比较鸡肋,只为了有利于理解java.sql.Date和java.util.Date之间的转换):
Date date = new Date(new java.util.Date().getTime());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd");
String dateStr = simpleDateFormat.format(date);
java.util.Date dateStrDatte = simpleDateFormat.parse(dateStr);
-------------------------------------------------分隔符-------------------------------------------------
最后的最后,我只是一位职场新人,有什么说的不好的,不对的,也希望大家能够帮忙指出,切勿人身攻击鸭;再见