在Javascript中格式化日期

4

如何格式化这个:

/Date(1292962456255)/

在JavaScript/jQuery中如何将日期呈现为常规格式?

这是什么类型的日期?是时间戳吗? - Pekka
从c3 Datetime对象返回的Json如下所示。 - slandau
2
这个日期的预期输出是什么? - KJYe.Name
我真的不知道。由于某种原因,将C#日期时间通过JSON传递到视图后,在执行.toString()操作后返回了这样的结果。 - slandau
@John -- 也许吗?我真的不知道。 - slandau
4个回答

4
这是我所说的“Microsoft日期”,以下函数将把编码日期转换为JavaScript日期时间。
            var msDateToJSDate = function(msDate) {
                var dtE = /^\/Date\((-?[0-9]+)\)\/$/.exec(msDate);
                if (dtE) {
                    var dt = new Date(parseInt(dtE[1], 10));
                    return dt;
                }
                return null;
            }

这不是有效的JavaScript代码,第一行应该使用等于号而不是冒号--还有return msEncodedDate是什么意思?如果字符串不匹配模式,则返回函数本身?这根本没有任何意义。 - Theo
@Theo,你关于相等的观点是正确的。但是你的第二个观察是错误的。如果字符串匹配正则表达式,该函数将返回JS日期。否则,将返回传入的原始值。显然,您可以修改此内容以返回错误代码或null。 - John Hartsock
啊,抱歉,我看错了参数名,以为是函数名。这样做还是很奇怪的,如果我期望得到一个日期,却得到了一个字符串,我会非常惊讶。返回 null 或引发异常会更加合适。 - Theo
@Theo 我希望C#不会通过JSON传递无效的日期。 - John Hartsock
你永远不能相信你所得到的一定是正确的。 - Theo

2

看看 moment.js 吧!它是一个“用于解析、操作和格式化日期的轻量级 JavaScript 日期库”。它是一个非常强大的小型库。

下面是一个例子...

var today = moment(new Date());
today.format("MMMM D, YYYY h:m A");        // outputs "April 11, 2012 2:32 PM"

// in one line...
moment().format("MMMM D, YYYY h:m A");     // outputs "April 11, 2012 2:32 PM"

以下是另一个例子...

var a = moment([2012, 2, 12, 15, 25, 50, 125]);
a.format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Monday, March 12th 2012, 3:25:50 pm"
a.format("ddd, hA");                       // "Mon, 3PM"
a.format("D/M/YYYY");                      // "12/3/2012"

另外值得一提的是要查看date.js。我认为这两个库互补。


1

这个数字是毫秒级别的时间戳。可以将此数字传递给JavaScript的Date类构造函数。所需的只是一些代码来从字符串中提取它:

var dateString = "/Date(1292962456255)/";
var matches = dateString.match(/^\/Date\((\d+)\)\/$/);
var date = new Date(parseInt(matches[1], 10));

第二行的正则表达式有点混乱,因为字符串恰好包含了 /、( 和 ) 这些字符,而它们在正则表达式中也是必需的(你确定你的字符串看起来是这样的,而不是描述一个可以提取它们的模式吗?)。
另一种方法是使用 eval:
var dateString = "/Date(1292962456255)/";
var date = eval("new " + dateString.substring(1, dateString.length - 1));

但这可能会导致XSS攻击,所以我不建议这样做。


不要忘记在 parseInt 中指定基数。 - John Hartsock
无需使用基数,因为默认为十进制。 - Theo
2
这并不正确。基数默认不是10进制。如果没有提供基数参数或者它被赋值为0,函数会尝试确定基数。如果字符串以1-9开头,则会解析为10进制。如果字符串以0x或0X开头,则会解析为16进制数字。如果字符串以0开头,则会解析为8进制数字。(请注意,仅仅因为一个数字以零开头,并不意味着它真的是八进制。) - John Hartsock

-2

我认为这是一个microtime。类似于PHP的microtime函数。或者在JavaScript中使用new Date().getTime()

// PHP
$ php -r "var_dump(microtime(true));"
float(1292963152.1249)

// JavaScript
new Date().getTime()
1292963411830

他要求提供能够格式化字符串中日期的代码,而不是日期本身。 - Theo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接