使用/不使用Moment.js进行日期格式化

10

我正在尝试重新格式化从API获取的日期。在对象中,我有:

created_at: "2013-06-13T16:29:55.245Z"

我想将日期显示为6/13/2013。有人建议我使用moment.js。它有很多文档,但我有点困惑如何使用它。请问是否有人可以帮忙或提出更简单的方法来完成这个任务?


你只想要'T'之前的字符串格式化吗? - user1853788
4个回答

8
无需修改原始字符串,您可以直接像这样使用它:
alert(moment("2013-06-13T16:29:55.245Z").format("M/DD/YYYY"));

运行良好:http://jsfiddle.net/K5ub8/2/


4
在几秒钟内,你只需要这样做。

var timeStr = "2013-06-13T16:29:55.245Z",
    newFormat = moment(timeStr).format('M/DD/YYYY');

document.body.textContent = newFormat;
<script src="https://rawgithub.com/timrwood/moment/2.9.0/min/moment.min.js"></script>

输出

6/13/2013 

如果没有时间戳,并且使用纯字符串操作而不是 new Date 对象,您可以这样做:

var timeStr = "2013-06-13T16:29:55.245Z",
    temp = timeStr.split("T")[0].split("-").reverse(),
    newFormat;

temp[0] = temp.splice(1, 1, temp[0])[0];
newFormat = temp.join("/");
if (newFormat.charAt(0) === "0") {
  newFormat = newFormat.slice(1);
}

document.body.textContent = newFormat;

输出

6/13/2013 

通过使用Date对象,参见@Antony答案 答案已删除

或者,如果您需要更加跨浏览器兼容Date对象,但仍然需要进行字符串解析。

var timeStr = "2013-06-13T16:29:55.245Z",
    intermediate = timeStr.split("T"),
    newStr = intermediate[0].split("-").join("/") + " " + intermediate[1].split(".")[0] + " GMT",
    newDate = new Date(newStr),
    newFormat = (1 + newDate.getUTCMonth()) + "/" + newDate.getUTCDate() + "/" + newDate.getFullYear();

document.body.textContent = newFormat;

输出

6/13/2013 

最后,您可以将字符串拆分成组件部分,并将其使用这些参数提供给Date.UTC而不是让Date进行字符串解析。

Date.UTC(year, month, day [, hour, minute, second, millisecond]);

因此,也许您现在可以看到为什么人们建议使用 moments.js ,但只要您有知识,那么没必要使用库来完成此操作也不会太麻烦。


我更多是指除了格林尼治标准时间(GMT)之外的每个人,在使用这些示例时都需要确保考虑到时区,以便将其转换为自己所在地的本地时间。将其转换为GMT/UTC很容易,我更关注的是如何将其转换出来,并且我的观点更多是关于硬编码日期的问题。Date.UTC()会给你从1970年1月1日午夜开始的毫秒数,以UTC时间计算,但你仍然需要使用new Date(),比如new Date(Date.UTC(96, 11, 1, 0, 0, 0));,才能得到适合你所在地区的日期/时间。而使用这些数字将会给我11月30日晚上7点,而不是12月1日凌晨。 - vapcguy
我的意思是,如果我想要在使用KnockOut viewmodel的Kendo datepicker中硬编码一个日期,那么我需要将它指定为比本来的时间晚5个小时,因为我处于GMT-5时区,即东部标准时间。所以,我不能像这样想var dateString = 0000-01-01T00:00:00.0Z,而是必须写成var dateString = 0000-01-01T05:00:00.0Z。我的字符串看起来像这样:this.MyDate = ko.observable(new Date(moment(dateString).format('MM/DD/YYYY')))。(当然,后来我发现最早支持的Kendo datepicker日期是1900年1月1日...但这是另外一个故事了。) - vapcguy
1
这些例子请参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/parse#Examples - Xotic750
我创建了一个分支版本的你的JSFiddle - 它可能有助于演示我的意思: http://jsfiddle.net/navyjax2/zLp1kjkw - vapcguy
1
是的,这就是为什么我提供了一个非常古老的表格链接http://dygraphs.com/date-formats.html,展示了一些这些差异。众所周知,依赖于`Date.parse`是一个坏主意,最好自己执行解析(对于您正在使用的字符串),然后将部分输入到`Date`或`Date.UTC`中,具体取决于您的要求。这就是为什么首先建议进行字符串操作的原因。这里有一个进一步的例子http://stackoverflow.com/questions/27720916/converting-string-into-date-format-in-js/27721275#27721275 - Xotic750
显示剩余5条评论

1
也许你可以使用split函数。
var tuple = createdAt.split("T");
var date = tuple[0];
var dateTuple = date.split("-");
var day = parseInt(dateTuple[2]);
var month = parseInt(dateTuple[1]);
var year = parseInt(dateTuple[0]);
var newFormatedDate = [ month , day,  year ].join("/");

更好了,现在它显示的是06/13/2013,但是OP想要的是6/13/2013:http://jsfiddle.net/Xotic750/mRPcP/ - Xotic750
抱歉,我没有注意到月份中的0。 - Edorka
现在这个代码可以工作了,尽管原帖并没有明确指出日期是否需要在天数前加上前导零,只要在月份前加上即可,而年份应该没有前导零(很可能是这样),+1。 - Xotic750

-1
你可以查看这个时间格式API - https://www.mashape.com/parsify/format#!endpoint-Time 我输入了你的日期 "2013-06-13T16:29:55.245Z" 并得到以下回复 -
{
  "given": "2013-06-13T16:29:55.245Z",
  "time": {
  "daysInMonth": 30,
  "millisecond": 245,
  "second": 55,
  "minute": 29,
  "hour": 16,
  "date": 13,
  "day": 4,
  "week": 24,
  "month": 5,
  "year": 2013,
  "zone": "+0000"
 },
  "formatted": {
  "weekday": "Thursday",
  "month": "June",
  "ago": "2 hours",
  "calendar": "Today at 4:29 PM",
  "generic": "2013-06-13T16:29:55+00:00",
  "time": "4:29 PM",
  "short": "06/13/2013",
  "slim": "6/13/2013",
  "hand": "Jun 13 2013",
  "handTime": "Jun 13 2013 4:29 PM",
  "longhand": "June 13 2013",
  "longhandTime": "June 13 2013 4:29 PM",
  "full": "Thursday, June 13 2013 4:29 PM",
  "fullSlim": "Thu, Jun 13 2013 4:29 PM"
 },
  "array": [
   2013,
   5,
   13,
   16,
   29,
   55,
   245
  ],
 "offset": 1371140995245,
 "unix": 1371140995,
 "utc": "2013-06-13T16:29:55.245Z",
 "valid": true,
 "integer": false,
 "zone": 0
}

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