繁体   English   中英

获取节点js中唯一日期的unix时间戳

[英]Get unix timestamp of only date in node js

我在节点 js 中仅在日期(无时间)上获取 unix 时间戳时遇到问题。 我试过moment js

我试过这个,

moment.unix();// which gives,1446090606

如果我使用相同的 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

它与昨天的日期相呼应

总结一下我想要的是,只有没有时间的日期的时间戳。

谢谢你。

首先,你需要问问自己最终要找的是什么。 以标准UTC格式保存所有时间戳确实符合您的最佳利益,如果您要存储字符串,请使用ISO8601标准。 好玩: ISO8601上的XKCD

它将使您的生活更容易以一种格式(UTC时区/ ISO8601格式,如果是字符串)传递日期,直到您将它们显示给用户之前。

只有这样才能格式化日期,因为用户希望将其格式化为代表本地时间,您应该编写日期格式化程序以确保始终以一致的方式完成此转换。

在客户端,在用户捕获日期并将其发送到服务器之前将日期转换为此标准化格式(实际上与上述格式化程序相反)。

除此之外的所有服务器日期逻辑通常都会计算时差,而无需担心时区转换。 /咆哮

现在更详细地讨论您的问题以及您遇到问题的原因。

根据moment.js 文档

默认情况下,时刻会以本地时间进行分析和显示。

所以当你这样做时:

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')

为了争论和理解,我已经包含了另一个变量,它在“午夜”之前捕获并将“现在”转换为UTC时区。

那么这里的区别是什么? 阅读UTC上的moment.js文档:

使用moment.utc()创建的任何时刻都将处于UTC模式,而使用moment()创建的任何时刻都不会。

要从UTC切换到本地时间,您可以使用#utc或moment#local。

当对它们执行其他操作时,moment.js变量将时区信息自包含在其中。 重要的是要区分它与标准PHP Date行为之间的区别,该行为将日期视为相同(除非您另有明确说明)。

需要知道或设置在每种情况下使用的时区。 完全不理解这两种行为很可能是你混淆的根源。

“日期是日期是日期”。 一个时刻,因此图书馆名称“moment.js”。 需要说明或设置日期所在的时区。有不同的格式来捕获这些信息,但只要明白“2015-10-29 04:50:06”在你知道时区之前不会告诉你什么 它基本上与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时间戳“0”的看法所证明的那样。 所以,了解它们现在所代表的内容,让我们从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时区的完整参考, 请单击此处

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)< - 记住有用的时区后缀moment.js输出.format()? 太阳在科罗拉多州还没有完全升起,因为太阳升起在东方并且在西方。 那么什么时间是早上6点前6小时? 午夜!

当然,我们明确转换为UTC前置的日期看起来像实际的午夜。 为什么? 因为PHP设置为以UTC格式化日期。 还要注意,这是前一天。 你现在应该足够了解自己=)

合理?

您必须先创建没有小时部分的日期,如下所示:

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但是,当你在这里查看时 ,你可以看到这是代表的日期:

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这是你需要的。 你可以在这里查看

UTC: Thursday 29th October 2015 12:00:00 AM

我使用@forgo回答简化了我的代码。

这就是我在纯 Javascript 中的做法:

var today = new Date()
today.setUTCHours(0, 0, 0, 0)
var today_timestamp = Math.floor(today.getTime() / 1000)

如果要获取当前时区的值,请改用setHours

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM