【问题标题】:jqGrid date formatting generates wrong AM/PMjqGrid 日期格式生成错误的 AM/PM
【发布时间】:2012-08-27 06:42:06
【问题描述】:

我在 jqgrid 中有列建模如下:

colModel: [
          ...
          { name: 'TranDate', index: 'TranDate', search: false, width: 150, 
            sorttype: 'date', formatter: 'date', 
            formatoptions: { srcformat: 'Y-m-d H:i:s A', newformat: 'd-M-Y h.i A'} },
         ...
         ],

从 JSON 返回的数据具有以下格式 2012-07-06 3:25:19 PM,但当使用上述格式显示在网格上时,它会将 PM 切换为 AM12:0112-59 之间的时间除外。

此问题与AM/PM date formatting in jqGrid 类似,但即使经过修改,问题仍然存在。

我错过了什么或做错了什么?

【问题讨论】:

    标签: jqgrid jqgrid-formatter


    【解决方案1】:

    问题是jquery.fmatter.js中的DateFormat函数不支持srcformat中的AM/PM:

        // Tony Tomov
        // PHP implementation. Sorry not all options are supported.
        // Feel free to add them if you want
        DateFormat : function (format, date, newformat, opts)  {
    

    具体来说,您可以在下面看到解析给定日期时不支持A 选项:

            } else {
                date = String(date).split(/[\\\/:_;.,\t\T\s-]/);
                format = format.split(/[\\\/:_;.,\t\T\s-]/);
                // parsing for month names
                for(k=0,hl=format.length;k<hl;k++){
                    if(format[k] == 'M') {
                        dM = $.inArray(date[k],dateFormat.i18n.monthNames);
                        if(dM !== -1 && dM < 12){date[k] = dM+1;}
                    }
                    if(format[k] == 'F') {
                        dM = $.inArray(date[k],dateFormat.i18n.monthNames);
                        if(dM !== -1 && dM > 11){date[k] = dM+1-12;}
                    }
                    if(date[k]) {
                        ts[format[k].toLowerCase()] = parseInt(date[k],10);
                    }
                }
                if(ts.f) {ts.m = ts.f;}
                if( ts.m === 0 && ts.y === 0 && ts.d === 0) {
                    return "&#160;" ;
                }
                ts.m = parseInt(ts.m,10)-1;
                var ty = ts.y;
                if (ty >= 70 && ty <= 99) {ts.y = 1900+ts.y;}
                else if (ty >=0 && ty <=69) {ts.y= 2000+ts.y;}
                timestamp = new Date(ts.y, ts.m, ts.d, ts.h, ts.i, ts.s, ts.u);
            }
    

    您有几个选择。如果您可以修改 Web 服务,您可以让它以不同的格式(例如 unix 时间戳)返回日期,或者让它以受支持的格式返回新的日期列。或者,您可以将此报告为 jqGrid 错误和/或修复这部分代码以支持 AM/PM 说明符。

    【讨论】:

    • 您的链接让我们大开眼界,感谢您的参与。我发现第一个选项更容易实现并从服务器返回所需的格式。只要有解决方法,我认为打开错误报告并不重要。再次阅读链接上的开放 cmets 可能有理由不尝试实施任何可能的选项或格式。
    【解决方案2】:

    之所以这样做,是因为它假设您的时间是 24 小时制。您的代码应该修复它,但我找不到它有什么问题。

    但是,这里会为你解决它

    替换掉这个

    formatter: 'date', formatoptions: { srcformat: 'Y-m-d H:i:s A', newformat: 'd-M-Y h.i A'} },
    

    有了这个

    datefmt: "Y-m-d h:i A" 
    

    在这里,您将无法将“Y-m-d”更改为“d-M-Y”。

    【讨论】:

    • 替换为 datefmt: "m/d/Y h:i A" 会显示返回的 JSON 格式 (2012-07-06 3:25:19 PM) 中的数据。我想要的是显示为06-Jul-2012 3.25 PM
    • 如果您可以在 24 小时内从服务器发送数据,那么您之前的代码将修复 AM/PM 问题
    • 我发现从服务器端格式化日期更容易。这样,我只需要以我需要的格式对其进行一次格式化,并避免在网格上显示时再次指定格式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 2021-02-17
    • 2022-07-18
    • 2015-06-07
    • 2016-02-25
    • 1970-01-01
    相关资源
    最近更新 更多