我是一个典型的服务器端开发人员,感觉有点像水中的鱼,试图在前端显示时间值。如何从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()函数,仍将返回时区更正值(在我的情况下,这是不正确的几个小时,因为格式化的时间与客户端计算机无关)。
答案 0 :(得分:10)
你应该意识到的一些事情:
Unix时间戳应始终以UTC表示。它们永远不会以数字形式调整时区。如果他们针对时区进行了调整,则在解释数字时进行,而不是在其表示中。
虽然传统上“Unix时间戳”是秒,但许多环境使用毫秒。 PHP的date
时间戳基于秒,而moment和JavaScript的Date
对象默认使用毫秒。使用moment.unix
函数可以让你传递秒数,并且只是将时间戳乘以1000相同。
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 模式中,因此任何输出都将显示为本地时间。
当您致电moment.unix(input)
时,输入为秒数,但该时刻仍处于本地模式。因此,要显示UTC时间,您可以使用moment.unix(input).utc()
。
如果您预先记录的其他系统的时间戳是数字形式,但已经远离UTC调整,则它们不正确。你有糟糕的数据,Moment无法帮助你,除非你明确知道他们偏离了 ,你编写代码来抵消它。
Moment的格式化程序区分大小写。 M
是几个月,m
是分钟。 H
是24小时制的小时,h
是12小时制的小时。如果要包含零填充,请使用两个连续的字母。例如HH:mm:ss
13:02:03
与h:m:s
1:2:3
{/ 1}}。{/ p>
Moment的X
格式化程序并不关心当前的模式。它将始终以UTC为单位发出秒数。同样,x
格式化程序返回UTC的毫秒数,moment.valueOf()
也是如此。
另外,你的最后一个例子:
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.
注意: