谨慎使用Date和Time类

本文介绍了JAVA里日期和时间类从数据库读取值时可能丢失数据的问题,不同数据库存储时间精度不同,比较日期对象时易出现BUG。还提到java.sql.Timestamp类精度高,使用时需注意毫微秒部分,使用java.sql包中时间类可能导致人为错误。
 JAVA里提供的日期和时间类,java.sql.Date和java.sql.Time,只会从数据库里读取某部分值,这有时会导致丢失数据。例如一个包含2002/05/22 5:00:57 PM的字段,读取日期时得到的是2002/05/22,而读取时间时得到的是5:00:57 PM.


你需要了解数据库里存储时间的精度。有些数据库,比如MySQL,精度为毫秒,然而另一些数据库,包括Oracle,存储SQL DATE类型数据时,毫秒部分的数据是不保存的。以下操作中容易出现不易被发现的BUG:

获得一个JAVA里的日期对象。
从数据库里读取日期
试图比较两个日期对象是否相等。如果毫秒部分丢失,本来认为相等的两个日期对象用Equals方法可能返回false。
java.sql.Timestamp类比java.util.Date类精确度要高。这个类包含了一个getTime()方法,但是它不会返回额外精度部分的数据,因此必须使用getNanos()方法。有毫微秒部分(即额外精度部分)的数值可能比没有这个部分的数值的大一个毫秒。如果你知道你使用的数据库保存了毫秒部分,可以用下面的代码获得的数值:

long time=timestamp.getTime()+timestamp.getNanos()/1000000;
毫微秒的部分就是为什么一个java.sql.Timestamp对象不等于一个java.util.Date对象,而一个java.util.Date对象可能等于一个java.sql.Timestamp对象的原因。这使得equals方法应当保持的对称被打破了。

使用java.sql包中的时间相关的类是重要的,但是它们也可能导致人为的错误。

这是因为,这些类的复杂性虽然已经在javadoc里面清楚的描述了,但是由于这些类看上去很简单而很少有人看这些文档。
<think>好的,用户想了解如何使用`date`命令设置系统时间。首先,我需要确认用户的操作系统,因为不同的系统可能有不同的命令选项。不过通常`date`在LinuxUnix-like系统中使用较多。 接下来,用户可能需要基本的设置步骤,比如设置当前日期时间。这时候需要说明`date`命令的基本语法,例如`sudo date -s "YYYY-MM-DD HH:MM:SS"`。同时要提醒用户需要管理员权限,所以要用`sudo`。 然后,用户可能想知道如何单独设置日期或时间部分。这时候需要分点说明,比如只设置日期或时间,给出具体的命令示例,例如`sudo date -s "2023-10-05"``sudo date -s "15:30:00"`。 另外,时区设置也是一个重要部分。用户可能需要了解如何通过链接`/etc/localtime`来更改时区,例如使用`sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime`。同时,提醒可能需要同步硬件时钟,特别是处理时区变更后的操作。 用户可能还会遇到需要同步硬件时钟的情况,比如使用`hwclock --systohc`命令,这里需要解释为什么需要这样做,因为系统时间硬件时钟是分开的。 此外,用户可能对时间同步服务如NTP感兴趣,可以建议安装`ntp`或`systemd-timesyncd`,并说明启用服务的命令,这样系统时间会自动同步网络时间,避免手动设置的麻烦。 注意事项方面,要强调权限问题,修改系统时间需要root权限。同时提醒修改系统时间可能影响日志、计划任务等,需谨慎操作。对于服务器,建议使用NTP服务保持时间同步,避免手动调整带来的问题。 最后,验证修改是否成功,可以用`date`或`timedatectl`命令检查当前时间时区。确保用户能够确认他们的更改已经生效。 需要确保回答结构清晰,分步骤说明,每个部分都有示例命令,并且涵盖常见的使用场景潜在问题,比如权限、时区、硬件时钟同步以及自动时间同步服务。这样用户能够全面了解如何使用`date`命令,并处理相关的问题。</think>### 使用 `date` 命令设置系统时间(Linux系统) #### 1. **基本语法** ```bash sudo date -s "YYYY-MM-DD HH:MM:SS" ``` - **示例**: ```bash sudo date -s "2023-10-05 15:30:00" ``` - **说明**: - `-s` 表示设置时间。 - 需使用管理员权限(`sudo`)。 --- #### 2. **仅设置日期或时间** - **仅设置日期**: ```bash sudo date -s "2023-10-05" ``` - **仅设置时间**: ```bash sudo date -s "15:30:00" ``` --- #### 3. **时区设置** - **查看当前时区**: ```bash timedatectl ``` - **修改时区**(例如改为上海时区): ```bash sudo timedatectl set-timezone Asia/Shanghai ``` 或手动链接时区文件: ```bash sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ``` --- #### 4. **同步硬件时钟** 系统时间修改后,需同步到硬件时钟(避免重启后失效): ```bash sudo hwclock --systohc ``` --- #### 5. **使用NTP自动同步时间** - **安装NTP服务**: ```bash sudo apt install ntp # Debian/Ubuntu sudo yum install ntp # CentOS/RHEL ``` - **启用服务**: ```bash sudo systemctl enable --now ntp ``` - **或用`systemd-timesyncd`**: ```bash sudo timedatectl set-ntp true ``` --- #### 6. **验证时间** ```bash date # 查看当前系统时间 timedatectl # 查看详细时间与时区信息 ``` --- ### 注意事项 1. **权限问题**:修改系统时间需 `root` 权限。 2. **影响范围**:修改时间可能影响日志、定时任务(如`cron`)、证书验证等。 3. **服务器建议**:优先使用NTP服务自动同步,避免手动修改。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值