使用像PHP的日期和strtotime的Moment.js

时间:2015-08-11 18:07:47

标签: javascript php jquery date momentjs

我是一个典型的服务器端开发人员,感觉有点像水中的鱼,试图在前端显示时间值。如何从moment.js中获取PHP的date()和strtotime()函数等行为?我只想让unix时间戳以H:i:s格式出现,反之亦然。

到目前为止,我已经从现有的示例代码和文档中尝试了以下内容:

jesssionid

不是单一的一个已经正常工作。这可能被标记为重复,因为那里有很多moment.js问题,但我不知道它是对库本身的更新还是稍微不同的上下文,我还没有找到一个对我有用的现有解决方案。

有人对这两个简单的任务有什么建议吗?

修改 我已经从中提炼出了两个不同的问题。一个是,当文档应该起作用的时候,功能正在给出奇怪的值:

moment(timestamp).format(H:i:s);
moment().duration(timestamp).format(H:i:s);
moment.unix(timestamp).format(h:mm:ss);
moment(formatted,'H:i:s');
例如,应该返回7:00:00 utc,返回10:17:42。在这种情况下,这可以通过使用moment.unix(1437462000).utc()。format('h:mm:ss')来修复,但这导致了第二个问题 - .utc()函数似乎被忽略了从日期转换回时间戳时:

moment(1437462000).format('h:mm:ss')
无论是否包含.utc()函数,

仍将返回时区更正值(在我的情况下,这是不正确的几个小时,因为格式化的时间与客户端计算机无关)。

2 个答案:

答案 0 :(得分:10)

你应该意识到的一些事情:

  1. Unix时间戳应始终以UTC表示。它们永远不会以数字形式调整时区。如果他们针对时区进行了调整,则在解释数字时进行,而不是在其表示中。

  2. 虽然传统上“Unix时间戳”是,但许多环境使用毫秒。 PHP的date时间戳基于秒,而moment和JavaScript的Date对象默认使用毫秒。使用moment.unix函数可以让你传递秒数,并且只是将时间戳乘以1000相同。

  3. Moment有两种内置模式, local UTC 。默认模式为 local 。您提供的输入无关紧要,如果您未指定UTC,则将该时刻调整为本地。要指定UTC,请使用utc功能。函数有两种形式:

    moment.utc(input)   // parsing form
    
    moment(input).utc() // conversion form
    

    两种形式都需要一些输入,并在UTC模式下产生片刻。不同之处在于输入解释的方式。在任何一种情况下,如果输入值是明确的,结果是相同的。对于字符串,这意味着输入将包含Z(来自ISO8601)或基于UTC的偏移量。所有其他形式都不明确。例如,如果我通过"2015-11-08 01:23:45",我会得到不同的结果,具体取决于我是将该字符串解释为本地时间还是UTC。

    对于数字,它们始终解释为UTC的毫秒数。但是,如果您在没有调用moment(number)的情况下使用.utc(),那么该时刻将保留在 local 模式中,因此任何输出都将显示为本地时间。

  4. 当您致电moment.unix(input)时,输入为秒数,但该时刻仍处于本地模式。因此,要显示UTC时间,您可以使用moment.unix(input).utc()

  5. 如果您预先记录的其他系统的时间戳是数字形式,但已经远离UTC调整,则它们不正确。你有糟糕的数据,Moment无法帮助你,除非你明确知道他们偏离了 ,你编写代码来抵消它。

  6. Moment的格式化程序区分大小写。 M是几个月,m是分钟。 H是24小时制的小时,h是12小时制的小时。如果要包含零填充,请使用两个连续的字母。例如HH:mm:ss 13:02:03h:m:s 1:2:3 {/ 1}}。{/ p>

  7. Moment的X格式化程序并不关心当前的模式。它将始终以UTC为单位发出秒数。同样,x格式化程序返回UTC的毫秒数,moment.valueOf()也是如此。

  8. 另外,你的最后一个例子:

    moment.unix(1437462000).utc().format()
    

    返回"2015-07-21T07:00:00+00:00" - 我认为这是您期望的价值。

    无论您尝试哪种方式,您都会得到相同的原始时间戳:

    moment.unix(1437462000).utc().format("X") // "1437462000"
    moment.unix(1437462000).format("X")       // "1437462000"
    moment.unix(1437462000).utc().unix()      // 1437462000
    moment.unix(1437462000).unix()            // 1437462000
    

答案 1 :(得分:1)

对于任何进入并仍在寻找date()和strtotime()的直接PHP等价物的人来说,这里是我最终使用的那些。匹配到php基本上意味着通过确保所有内容都是UTC来完全忽略任何类型的本地时间信息。但是, timestamp-> date date-> timestamp 案例之间的任务略有不同,所以你必须要小心。

<强>日期()

将时间戳转换为格式化日期而不进行任何客户端时区更正

var formatted = moment.unix(timestamp).utc().format('h:mm:ss');

<强>的strtotime()

将UTC格式的日期转换回时间戳,而不将其更正为当地时间:

var new_timestamp = moment.utc(formatted_utc,'DD/MM/YYYY H:m:s').format('X')
//where 'DD/MM/YYYY H:m:s' is the formatted date's format, and 
//'X' outputs a unix timestamp without milliseconds. 

注意:

  • 不要在调用中使用带括号的moment(): moment()。utc(date,format)将返回本地时间值,而不是你的 输入
  • Moment.js不喜欢使用&#39; i&#39;在格式化中分钟, 不像php。