ExtJS/Javascript-日期字段通过GUI转换不正确
正在寻求有关如何通过GUI显示日期字段的帮助 问题:ExtJS/Javascript-日期字段通过GUI转换不正确,javascript,date,extjs,store,extjs5,Javascript,Date,Extjs,Store,Extjs5,正在寻求有关如何通过GUI显示日期字段的帮助 问题: 我通过日历选择日期字段-如果我选择2016-02-07并将其保存到数据库,为什么GUI会以GMT(2016-02-06)显示日期 对于“开始时间”和“结束时间”字段,为什么它会保存到我的数据库中,并以“2008-01-01T”作为前缀 一些背景资料: 数据库类型:PostgreSQL ExtJS:5.0.1 数据库正在将值存储为: 日期=2016-02-07 开始时间=2008-01-01T05:00:00 结束时间=2008-01-1T07
谢谢大家! 从服务器读取/写入日期值 有许多选项可以选择如何从服务器读取/写入日期值 问题是JSON标准没有日期的特殊数据类型。日期可以作为字符串、整数或各种格式的对象传输,甚至可以(故意)违反JSON标准(“Microsoft方式”) 日期本身是一个复杂的对象,既是自某个时间起秒数的整数,也是一个告诉您所在时区的值。时区本身也是复杂的对象,仅Windows操作系统就知道有104个时区。围绕着混乱 使用
form.submit()
时,表单将字符串化所有日期字段值。恐怕没有办法以一种自我定义的方式将其严格化;ExtJS将始终生成默认字符串。这取决于后端是否能够理解默认字符串,因为正如我已经提到的,没有标准
使用model.save()
或store.sync()
时,方法不同。当您说form.updateRecord()
时,表单将向模型移交一个JavaScript日期;如果model字段是类型:date
,它将存储一个javascript日期。当字符串化提交日期时,该字段使用dateWriteFormat
或dateFormat
配置,随后在save()
和sync()
期间都会遵守该配置。在此转换过程中,ExtJS仅在某些情况下处理时区,具体取决于格式
调用store.load
或model.load
时,相同的操作会进入不同的方向。但是read方法使用的不是dateWriteFormat
,而是dateReadFormat
。如果对两者使用相同的值,则转换是完全可逆的。但是
- 当使用
阅读“2016-01-01”时,我的计算机上的日期是2016-01-0100:00:00 GMT+01:00dateFormat:'Y-m-d'
- 使用
阅读“2016-01-01”时,我的计算机上的日期是2016-01-0101:00:00 GMT+01:00李>dateFormat:'c'
g:ia
作为dateWriteFormat,使用默认的c
作为dateReadFormat),那么一切都会乱成一团。
因此,推荐的方法是不要使用表单加载/提交,而更喜欢dateFormat
而不是dateWriteFormat
和dateReadFormat
。如果您总是指定兼容的格式(Y-m-d H:i
或c
,而不是两者都指定),并且在服务器端正确执行转换,您将是安全的
时间字段
时间字段选择时间,但JavaScript日期值也需要日期。因此,ExtJS发明了以下初始化,如果您愿意,可以覆盖某些时间字段:
initDate: '1/1/2008',
initDateParts: [2008, 0, 1],
initDateFormat: 'j/n/Y',
确保initDate和initDateParts都是同步的,否则可能会出错。但大多数情况下,您会对模型中的字段使用
dateFormat:'H:i'
,完全跳过日期。对于时间字段,日期只是一个占位符。在比较时间字段值时,请确保时间字段具有相同的initDate(通常是这样,除非您重写它们)。我将使用相同的格式配置所有不同的组件
type: "date",
dateFormat: "Y-m-d H:i:s"
xtype: "datefieldscheduler",
format: "Y-m-d H:i",
xtype: "datecolumn", // Ext.grid.column.Date
format: "Y-m-d H:i:s",
renderFormat: "Y-m-d H:i"
在本例中,我们在内部使用相同的格式,要以不同的格式显示,请使用renderFormat 最重要的代码丢失了。请说明如何将数据提交到服务器。您是否使用
store.sync
、model.save
或form.submit
?你的表单是如何定义的?我正在使用一个store.sync函数-我已经将它和表单定义添加到上面的代码中。“日期本身是一个复杂的对象,”,不是真的,它只是一个自纪元以来的时间和一堆继承的方法。时区偏移量不是日期实例的属性,它是从主机系统检索的。尝试以下操作:创建一个日期并调用getTimezoneOffset。现在更改系统时区并再次调用它。让人困惑的是无意中解析字符串或混合时区(根据您的回答)。我是否可以从时间戳中完全去掉2008-01-01T?我只想将时间本身存储到数据库中。在MS SQL Server的time
类型中传输存储时间时,我使用dateFormat:'H:I:s'
。有关所需格式,请参阅数据库文档。如果数据库存储了日期,则表明您使用了错误的数据库列类型。我已将dateFormat:'H:I:s'添加到我的时间字段和存储字段中。当我试图提交记录时,我的错误检查仍然显示f
initDate: '1/1/2008',
initDateParts: [2008, 0, 1],
initDateFormat: 'j/n/Y',
type: "date",
dateFormat: "Y-m-d H:i:s"
xtype: "datefieldscheduler",
format: "Y-m-d H:i",
xtype: "datecolumn", // Ext.grid.column.Date
format: "Y-m-d H:i:s",
renderFormat: "Y-m-d H:i"
Ext.define('Admin.overrides.Date', {
override :'Ext.form.field.Date',
dateFormat: 'Y-m-d H:i:s',
dateReadFormat:'Y-m-d H:i:s',
dateWriteFormat : 'Y-m-d H:i:s'
});