java怎么去掉时间后后边的.0
- 后端开发
- 2025-08-04
- 3795
Java中,可将
Date
转为
SimpleDateFormat
格式化字符串,用
HH:mm:ss
等不含毫秒的模式,或对
LocalDateTime
截取到秒级再转换,即可去掉时间后的”.0″
Java开发中,处理日期时间格式时经常会遇到需要去除末尾“.0”的需求(例如将2023-08-04 15:30:45.0
转换为2023-08-04 15:30:45
),以下是几种常见的实现方法及具体操作步骤:
通过SQL语句截断精度
如果数据来源于数据库(如Oracle),可直接在SQL查询时使用TO_CHAR
函数控制输出格式。
SELECT TO_CHAR(your_date_column, 'YYYY-MM-DD HH24:MI:SS') FROM your_table;
此方式会直接返回不含毫秒数的字符串,天然避免“.0”问题,适用于仅需展示到秒级的场景。
优点 | 缺点 |
---|---|
性能高效 | 依赖数据库特性,移植性较差 |
代码简洁 | 无法动态调整格式 |
Java端格式化工具类SimpleDateFormat
使用SimpleDateFormat
指定目标模式,强制忽略小数部分,示例代码如下:
Date now = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 不包含毫秒 String formattedDate = sdf.format(now);
若原始时间为带毫秒的对象(如java.sql.Timestamp
),该方案会自动舍去多余位数,此方法适合本地化处理或后端逻辑中的中间转换。
关键参数解析 | 作用 |
---|---|
yyyy |
四位年份 |
MM |
两位月份(自动补零) |
dd |
两位日期 |
HH:mm:ss |
时分秒,无毫秒字段 |
Jackson序列化自定义处理器(针对JSON响应)
当通过REST API返回JSON数据时,可创建自定义序列化器继承JsonSerializer<Date>
,重写serialize
方法实现精准控制。
public class DateWithoutMillisecondSerializer extends JsonSerializer<Date> { @Override public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider provider) throws ... { // 将时间戳转为秒级Unix时间戳 jsonGenerator.writeNumber(date.getTime() / 1000); } } // 在实体类字段上添加注解: private Date createTime; // @JsonSerialize(using = DateWithoutMillisecondSerializer.class)
此方案特别适用于微服务架构下的API统一规范,能有效减少前后端协商成本。
字符串后处理(通用型补救措施)
对于已生成含“.0”的字符串,可采用正则表达式替换:
String dirtyString = "2023-08-04 15:30:45.0"; String cleanedString = dirtyString.replaceAll("\.0$", ""); // 匹配结尾的.0并删除
需要注意的是,这种方法属于最后防线,应优先选择前三种规范化方案以保证数据一致性。
不同场景选型建议对比表
场景特征 | 推荐方案 | 理由 |
---|---|---|
数据库层原始查询 | SQL TO_CHAR | 源头控制,减少传输冗余 |
纯Java业务逻辑处理 | SimpleDateFormat | 标准库支持,跨平台兼容性好 |
JSON接口响应优化 | Jackson自定义序列化 | 精准控制序列化行为,符合API设计最佳实践 |
历史遗留系统修复 | 字符串替换 | 快速实施,但需谨慎验证边界条件 |
相关问答FAQs
Q1: 为什么用SimpleDateFormat格式化后仍然显示”.0″?
A: 这通常是因为传入的对象实际上是java.sql.Timestamp
而非java.util.Date
,由于Timestamp
内部存储了纳秒精度的时间戳,即使值为0也会携带占位符,解决方案是改用new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parseObject(timestamp.toString())
进行显式类型转换。
Q2: 如何在JSP页面优雅展示去除”.0″后的日期?
A: 推荐组合使用Struts2标签库与预格式化策略:
<%@ taglib prefix="s" uri="/struts-tags" %> <!-假设action中已设置birthday属性为Date类型 --> <s:date name="birthday" format="yyyy年MM月dd日 HH时mm分ss秒"/>
这种方式既保证了服务器端的数据准确性,又实现了前端展示的灵活性