我在节点js中的 only date (没有时间)获取unix时间戳方面遇到问题。我尝试了moment js
我试过了,
moment.unix();// which gives,1446090606
如果我使用相同的i php,
echo date("Y-m-d H:i:s", 1446090606);// echoes 2015-10-29 04:50:06
但是今天的实际时间戳是1446073200
echo date("Y-m-d H:i:s", 1446073200);// echoes 2015-10-29 00:00:00
我甚至尝试在javascript中使用Date()
,
修改
我甚至试过这样,
console.log(moment("2015-10-29 00:00:00").unix());// which gives 1446057000
echo date("Y-m-d H:i:s", 1446057000);// echoes 2015-10-28 19:30:00
它与昨天的日期相呼应
总结我想要的是,只有没有时间的日期的时间戳。
谢谢。
答案 0 :(得分:3)
首先,你需要问自己最终要找的是什么。将所有时间戳保持为标准UTC格式并且如果要存储字符串,请使用ISO8601标准,这符合您的最佳利益。为了好玩:XKCD on ISO8601
它将使您的生活更容易以一种格式(UTC时区/ ISO8601格式,如果是字符串)传递日期,直到您将它们显示给用户之前。
只有这样才能格式化日期,因为用户希望将其格式化为代表当地时间,您应该编写日期格式化程序以确保始终以一致的方式完成此转换。
在客户端,在用户捕获日期并将其发送到服务器之前将日期转换为此标准化格式(实际上与上述格式化程序相反)。
除此之外的所有服务器日期逻辑通常都会计算时差,而无需担心时区转换。 /咆哮
现在更详细地讨论您的问题以及您遇到问题的原因。
根据moment.js docs:
默认情况下,时刻会以当地时间进行分析和显示。
所以当你这样做时:
moment.unix();
知道这与当地时间有关。此外,unix时间是相对于一个奇异时间点的秒数,这个时间段恰好是1970年1月1日00:00:00(当放入UTC时区时)。
让这个打到家。使用您的PHP日期函数并输入" 0"作为unix时间戳。你得到了什么?它取决于PHP环境中设置的默认时区。
对我来说,我使用的在线PHP沙箱的输出:
<?php echo date('Y-m-d H:i:s', 0); ?>
// 1969-12-31 16:00:00
哦,哦。这里发生了什么?那个之前的纪录时间,我绝对只是在那里放了一个大胖子。
因此,重要的是要保持日期格式的一致性。它会让你的生活更轻松。
1。获取当地日期的午夜时间。这是您需要在片刻变量中捕获的第一条信息,因为它代表您感兴趣的内容。一旦您拥有了这些信息,其余的只是了解如何根据您的需要设置日期格式。
var lastLocalMidnight = moment().startOf('day')
var lastUTCMidnight = moment.utc().startOf('day')
为了争论和你的理解,我已经包含了另一个变量,它捕获并转换了#34;现在&#34;在获得&#34;午夜&#34;。
之前进入UTC时区那么这里的区别是什么?请继续阅读UTC上的moment.js文档:
使用moment.utc()创建的任何时刻都将处于UTC模式,而使用moment()创建的任何时刻都不会。
要从UTC切换到本地时间,您可以使用#utc或 时刻#本地
moment.js变量在对它们执行其他操作时,其中包含时区信息。重要的是要区分它与标准PHP Date行为之间的区别,该行为将日期视为相同(除非您另有明确说明)。
每种情况下使用的时区都需要知道或设置。完全不理解这两种行为很可能是你混淆的根源。
A&#34;日期是日期&#34;。一个时刻,因此图书馆名称&#34; moment.js&#34;。需要说明或设置日期所在的时区。有不同的格式来捕获这些信息,但只需理解&#34; 2015-10-29 04:50:06&#34;在你知道时区之前,不会告诉你任何事情。它基本上与12:00在你知道AM或PM(假设你没有使用军事时间)之前没有告诉你的任何事情相同。
2。现在你已经有午夜代表(无论你认为哪个是正确的代表),你可以将它转换为UNIX时间戳,因为它相对于你认识的时区感兴趣并代表您想要的确切时刻。
console.log(lastLocalMidnight.format());
// e.g. - 2015-10-28T00:00:00-06:00
console.log(lastUTCMidnight.format());
// e.g. - 2015-10-29T00:00:00+00:00
console.log(lastLocalMidnight.unix());
// e.g. - 1446012000
console.log(lastUTCMidnight.unix());
// e.g. - 1446076800
$timezoneBeforeSet = date_default_timezone_get();
echo $timezoneBeforeSet."\n";
注意moment.js的format()函数默认显示UTC偏移量。因此,即使以这种方式进行打印看起来就像你想要的午夜,但是你知道如果你把它格式化为UTC(或者你请求日期之外的任何时区),它将不会在00:00:00结束。本来)。
提前转换为UTC的时刻,没有偏移。如果您稍后在本地时区格式化了那个,那么它将不会在00:00:00,并且moment.js format()的输出将指示基于您设置的时区的时区偏移(-06:00,对于例子)。
3。在PHP方面,你有一个默认的环境时区设置,正如我们通过查看PHP对unix时间戳&#34; 0&#34;的看法所证明的那样。因此,了解他们现在所代表的内容,让我们从moment.js获取我们获得的unix时间戳,并尝试使用PHP的日期格式化它们。
// Timestamps obtained from moment.js
$unixTimestampLocalMidnight = 1446012000;
$unixTimestampUTCMidnight = 1446076800;
// Relative to untampered timezone set in your PHP environment
$phpLocalMidnightUnchangedTZ = date('Y-m-d H:i:s', $unixTimestampLocalMidnight);
echo $phpLocalMidnightUnchangedTZ."\n";
// 2015-10-27 23:00:00
$phpUTCMidnightUnchangedTZ = date('Y-m-d H:i:s', $unixTimestampUTCMidnight);
echo $phpUTCMidnightUnchangedTZ."\n";
// 2015-10-28 17:00:00
所以是的。那些完全不是我们想要的,对吧?实际上他们是。它在某个地方的23:00:00和其他地方的午夜17:00:00,对吧?
我们需要确定PHP认为我们现在在哪里。我们可以使用Date输出该时区信息,但我们并不关心在最终输出中看到它(可理解)。那我们怎么知道呢,否则呢?很高兴你问:
$timezoneBeforeSet = date_default_timezone_get();
echo $timezoneBeforeSet."\n";
// US/Pacific
我在科罗拉多州是美国/山区,那么这笔交易是什么?嗯,这必须意味着我使用的在线PHP沙箱是在加利福尼亚州托管的东西。说得通。知道代码的运行位置。
但是不要太担心这件事。这就是我们预先捕获并转换为一致格式的原因,并且只关注我们真正需要它的格式化。这样,如果你的转换错误,你只需要在一两个地方更改它。
有关PHP时区的完整参考,click here。
4. 如果您对PHP环境有任何控制,则应将默认时区设置为UTC(您在项目引导或PHP环境配置中执行的首要操作之一)文件)。
// Explicitly set PHP default timezone to UTC
date_default_timezone_set('UTC');
$timezoneAfterSet = date_default_timezone_get();
echo $timezoneAfterSet."\n";
// UTC
$phpLocalMidnight = date('Y-m-d H:i:s', $unixTimestampLocalMidnight);
echo $phpLocalMidnight."\n";
// 2015-10-28 06:00:00
$phpUTCMidnight = date('Y-m-d H:i:s', $unixTimestampUTCMidnight);
echo $phpUTCMidnight."\n";
// 2015-10-29 00:00:00
所以这是有道理的。我们现在正在显示相对于UTC的时间。如果我最初在美国/山区时间拍摄午夜,我希望看到一天中的时间与英格兰格林威治的时间相对应。
如果您知道日期是使用时区格式化的,请考虑在时区指示的位置读取该日期时间。我们知道PHP正在吐出UTC的东西,所以当我看到输出时,我可以想象我在英格兰的格林威治。
如果早上06:00我在格林威治,那应该早6个小时在科罗拉多(-6:00)&lt; - 记住有用的时区后缀moment.js输出。格式()?在科罗拉多州,太阳还没有升起,因为东方的太阳升起,西方的太阳升起。那么什么时间是早上6点前6小时?午夜!
当然,我们明确转换为UTC前置的日期看起来像实际的午夜。为什么?因为PHP设置为以UTC格式化日期。还要提前一天注意它。你现在应该足够了解自己=)
有意义吗?
答案 1 :(得分:2)
您必须先创建没有小时部分的日期,如下所示:
var moment = require("moment");
var unixTime = moment().startOf('day').unix(); //last midnight in local time
console.log("Your timestamp: " + unixTime + " And your date: " + day);
现在,让我们看看你的例子。
哟说这个unix时间戳1446073200
但是,当你检查here时,你可以看到这是代表的日期:
UTC: Wednesday 28th October 2015 11:00:00 PM
并且还为您提供了当地时间的另一个日期,在我的情况下:
In your local time zone: Wednesday 28th October 2015 05:00:00 PM
所以,我的猜测是你在时区UTC + 1
的地方获得了unix时间戳,这就是为什么你认为这个unix时间戳1446073200
没有hour part
的原因}。
在我之前的示例中,您将获得当地时间的unix时间戳,在我的情况下是1446098400
,但您可能需要UTC时间,因此您应该稍微更改一下代码,例如这样:
var moment = require("moment");
var unixTime = moment.utc().startOf('day').unix(); //last midnight in UTC time
console.log("Your timestamp: " + unixTime + " And your date: " + day);
这将为您提供此unix时间戳:1446076800
这是您需要的时间戳。您可以查看here。
UTC: Thursday 29th October 2015 12:00:00 AM
我使用@forgo answer简化了我的代码。