Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用像PHP';s日期和时间_Javascript_Php_Jquery_Date_Momentjs - Fatal编程技术网

Javascript 使用像PHP';s日期和时间

Javascript 使用像PHP';s日期和时间,javascript,php,jquery,date,momentjs,Javascript,Php,Jquery,Date,Momentjs,我是一个典型的服务器端开发人员,在前端显示时间值时感觉有点像落汤鸡。如何从moment.js中获取PHP的date()和strotime()函数之类的行为?我只希望unix时间戳以H:I:s格式显示,反之亦然 到目前为止,我已经从现有示例代码和文档中尝试了以下内容: moment(timestamp).format(H:i:s); moment().duration(timestamp).format(H:i:s); moment.unix(timestamp).format(h:mm:ss);

我是一个典型的服务器端开发人员,在前端显示时间值时感觉有点像落汤鸡。如何从moment.js中获取PHP的date()和strotime()函数之类的行为?我只希望unix时间戳以H:I:s格式显示,反之亦然

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

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');
没有一个能正常工作。这可能会被标记为重复,因为有很多moment.js问题,但我不知道这是对库本身的更新还是稍微不同的上下文,我还没有找到一个对我有效的现有解决方案

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

编辑: 我从中提炼出两个不同的问题。一个是,当医生说应该工作的时候,函数给出了奇怪的值:

moment(1437462000).format('h:mm:ss')
例如,它应该返回utc 7:00:00,返回utc 10:17:42。在这种情况下,可以使用矩.unix(143746200).utc().format('h:mm:ss')来解决这个问题,但这会导致第二个问题-从日期转换回时间戳时,.utc()函数似乎被忽略:

timestamp = moment(formatted,'DD/MM/YYYY H:m:s').utc().unix();

无论是否包含.utc()函数,仍将返回一个时区更正值(在我的情况下,这是不正确的,因为所述格式化时间与客户端计算机无关)

您应该了解以下几点:

  • Unix时间戳应始终以UTC为单位。它们从不以数字形式针对时区进行调整。如果它们被调整为时区,那是在数字的解释过程中完成的,而不是在它的表示中

  • 虽然传统上“Unix时间戳”以秒为单位,但许多环境使用毫秒。PHP的
    date
    时间戳基于秒,而moment和JavaScript的
    date
    对象默认都使用毫秒。使用
    moment.unix
    函数可以让您通过秒数,这与将时间戳乘以1000完全相同

  • 矩有两种内置模式,本地模式和UTC模式。默认模式为本地模式。无论您提供什么输入,如果您不指定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表示为毫秒。但是,如果使用
    时刻(数字)
    而不调用
    .utc()
    ,则该时刻将保留在本地模式,因此任何输出都将显示为本地时间

  • 调用
    moment.unix(input)
    时,输入是秒数,但该时刻保持在本地模式。因此,要显示UTC时间,可以使用
    矩.unix(input).UTC()

  • 如果您从其他系统预先记录的时间戳是数字形式,但已从UTC调整,则它们是不正确的。你们有糟糕的数据,除非你们明确知道它们是如何偏离的,并且你们编写代码来抵消它们,否则“时刻”帮不了你们

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

  • 时刻的
    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
    

    对于那些进来仍在寻找date()和strotime()的直接PHP等价物的人,这里是我最终使用的。匹配php基本上意味着完全忽略任何类型的本地时间信息,确保所有信息都是UTC格式的。但是,这个任务在时间戳->日期和日期->时间戳的情况下有点不同,所以您必须小心

    日期()

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

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

    将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. 
    
    注:

    • 在调用中不要使用带括号的矩() 矩().utc(日期、格式)将返回本地时间值,而不是您的 输入
    • Moment.js不喜欢在格式中使用“i”表示分钟, 不像php

    您是否将功能结果显示在屏幕上?或者您正在生成一个用于另一个函数的值?在尝试从时间戳转换为格式化时间的情况下,它是用于显示的。如果使用另一种方式(格式化为时间戳),则需要解析要由函数使用的用户输入。文档中指出,它应该是`矩(时间戳)`或
    矩.unix(时间戳)
    。这些值有多大的错误?您有多确定时间戳是正确的?矩(timestamp)返回了非常奇怪的值