ExtJS datefield选择日期回存PostgreSQL出现日期少一天Bug
日期提交差1天问题解决方案
根因说明
- 前端datefield选择日期后生成的JS Date对象为本地时区(南非UTC+2)的零点时间,例:选择2021-07-31对应Date对象值为
2021-07-31T00:00:00+02:00 - 框架默认序列化Date对象为UTC时区的ISO字符串,上述时间转换为UTC格式后为
2021-07-30T22:00:00.000Z,后端直接取该字符串的日期部分就会出现差1天的问题,和夏令时无关。
解决方案
方案1:调整Store字段序列化逻辑(推荐,改动最小)
在原有Store的日期字段配置基础上,新增serialize配置项,提交时直接输出Y-m-d格式的纯日期字符串,不带时区信息:
{ name: 'mydatefield', type: 'date', dateFormat: 'Y-m-d', // 原有读取配置保持不变 // 新增序列化规则 serialize: function(value) { return value ? Ext.Date.format(value, 'Y-m-d') : null; } }
修改后提交的参数会直接变为mydatefield: '2021-07-31',和后端PostgreSQL的date类型完全匹配,不会触发时区转换。
方案2:调整datefield编辑器配置
如果不想修改Store配置,可以给datefield编辑器新增submitFormat配置,指定提交格式为Y-m-d:
{ xtype: 'datecolumn', format: 'Y-m-d', editor: { xtype: 'datefield', format: 'Y-m-d', submitFormat: 'Y-m-d' // 新增该行配置 } }
方案3:后端兼容处理(兜底方案)
若前端改动受限,后端可在接收日期参数后,先按UTC时区解析时间,再转换为南非时区后取日期部分存储即可,该方案兼容性稍弱,更推荐优先调整前端配置。
内容的提问来源于stack exchange,提问作者Schalk
相关产品推荐
相关产品推荐

