apache时间工具类apache.http.client.utils.Dateutils使用时区问题,java.util.Date和java.sql.Date之间的互换,获取某天的00:00

时间类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);

-------------------------------------------------分隔符-------------------------------------------------

最后的最后,我只是一位职场新人,有什么说的不好的,不对的,也希望大家能够帮忙指出,切勿人身攻击鸭;再见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值