Laravel中如何让date字段仅返回日期而非带时间的格式?
解决DATE字段取出带00:00:00的问题
这个问题我之前做项目的时候也碰到过,其实根源是大部分数据库驱动或者ORM工具在读取DATE类型字段时,会自动把它转换成带时间部分的datetime/timestamp对象,所以才会带出多余的00:00:00。下面分几个不同场景给你靠谱的解决方案:
1. 从数据库查询环节直接处理
如果能修改SQL语句,这是最直接的方式——让数据库返回纯日期字符串:
- MySQL/MariaDB:使用
DATE_FORMAT()函数格式化字段SELECT DATE_FORMAT(your_date_column, '%Y-%m-%d') AS your_date_column FROM your_table; - PostgreSQL:用
TO_CHAR()函数转换格式SELECT TO_CHAR(your_date_column, 'YYYY-MM-DD') AS your_date_column FROM your_table; - SQL Server:用
CONVERT()指定日期格式SELECT CONVERT(varchar, your_date_column, 23) AS your_date_column FROM your_table;
这样查询结果里的日期字段就是纯YYYY-MM-DD格式的字符串,不会带时间尾巴。
2. 后端代码层面处理
如果不想改动SQL,也可以在取出数据后对DATE字段做格式化处理,举几个常用语言的例子:
- Python(以Django/SQLAlchemy为例):
如果拿到的是datetime对象,直接用strftime()转成纯日期:# 假设date_obj是从数据库取出的datetime对象 pure_date = date_obj.strftime('%Y-%m-%d') # 如果是Django的DateField,也可以直接取date部分 pure_date = date_obj.date().isoformat() - Java:
用Java 8+的DateTimeFormatter格式化,或者直接用getDate()获取不带时间的java.sql.Date:// 方式1:格式化LocalDate LocalDate date = resultSet.getDate("your_date_column").toLocalDate(); String pureDate = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(date); // 方式2:直接返回字符串 String pureDate = resultSet.getString("your_date_column"); - PHP:
用format()方法处理DateTime对象,或者直接截取字符串:// 假设$date是从PDO取出的DateTime对象 $pureDate = $date->format('Y-m-d'); // 如果是字符串类型,直接截取 $pureDate = explode(' ', $dateStr)[0];
3. 前端展示层面处理
如果后端已经把带时间的字符串传到前端了,也可以在前端做处理:
- 原生JavaScript:
最简单的方式是直接截取日期部分,或者用Date对象格式化:// 直接截取 const dateStr = "2024-05-20 00:00:00"; const pureDate = dateStr.split(' ')[0]; // 用Date对象处理(兼容不同格式) const pureDate = new Date(dateStr).toISOString().split('T')[0]; - 框架场景(Vue/React):
可以自定义过滤器或工具函数,比如Vue的全局过滤器:
然后在模板中使用:Vue.filter('pureDate', function(value) { return value ? value.split(' ')[0] : ''; }){{ yourDate | pureDate }}
补充说明
为什么会出现这个问题?因为数据库的DATE类型本身只存储年-月-日,但很多驱动/ORM为了统一数据类型,会自动将其转换为包含时间的datetime/timestamp对象,默认补全00:00:00的时间部分,所以才会出现你看到的情况。
内容的提问来源于stack exchange,提问作者Btdev
相关产品推荐
相关产品推荐

