Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ExtJS/Javascript-日期字段通过GUI转换不正确_Javascript_Date_Extjs_Store_Extjs5 - Fatal编程技术网

ExtJS/Javascript-日期字段通过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

正在寻求有关如何通过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:00:00

    GUI显示的值如下所示:

    日期=2016-02-06(看起来它正在将DB值转换为GMT)

    开始时间=上午5:00

    结束时间=上午7:00

    商店:

    ))

    视图:

    保存:

    表格定义:


    谢谢大家!

    从服务器读取/写入日期值

    有许多选项可以选择如何从服务器读取/写入日期值

    问题是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
    。如果对两者使用相同的值,则转换是完全可逆的。但是

    • 当使用
      dateFormat:'Y-m-d'
      阅读“2016-01-01”时,我的计算机上的日期是2016-01-0100:00:00 GMT+01:00
    • 使用
      dateFormat:'c'
      阅读“2016-01-01”时,我的计算机上的日期是2016-01-0101:00:00 GMT+01:00
    如果混合使用这两种格式(使用
    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'
    });