将存储在mysql(utc格式)中的momentjs datetime格式化为Local DateTime

Posted

技术标签:

【中文标题】将存储在mysql(utc格式)中的momentjs datetime格式化为Local DateTime【英文标题】:Format momentjs datetime stored in mysql (utc format) to Local DateTime 【发布时间】:2015-12-14 05:57:40 【问题描述】:

我在表中有一个名为 registerdate 的列,在 mysql 中具有数据时间类型。

说现在时间是当地时间“2015-10-10 06:00:00”。

我在数据库中存储 UTC 时间,因此它将转换为“2015-10-10 00:30:00”,因为本地时间是 +530 GMT。所以正确的时间存储在数据库中。

如何在检索时将注册时间转换为本地时间。

这是我在将日期时间保存到数据库之前的转换方式

moment.utc(new Date()).format("YYYY-MM-DD HH:mm:ss")

这是我试图将其转换回本地时间。

moment.utc(registerdate, "YYYY-MM-DD HH:mm:ss").local().format("HH:mm:ss")

这不会更改保存的日期,并且呈现与存储在 db 中的相同。

第二种方法:它进一步减去5:30小时而不是增加它。

moment.utc(_obj[i].StartTime).format("HH:mm:ss")

我做错了哪一步。

【问题讨论】:

【参考方案1】:

您可能根本不需要使用 moment。如果来自数据库的日期是有效日期,那么您需要做的就是

var someDate = new Date("2015-10-10 00:30:00");
$("#content").html(someDate.toString());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="content">
<div>

你会看到这给了你本地时间,因为 JS 假设你给了它本地时间。

您可以在字符串末尾添加“Z”以强制 JS 将输入值假定为 UTC 时间。当“Z”(祖鲁语)被添加到时间的末尾时,表示该时间是UTC http://www.wikiwand.com/en/ISO_8601#/Time_zone_designators

var someDate = new Date("2015-10-10 00:30:00Z");
$("#content").html(someDate.toString());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="content">
<div>

如果您需要使用时刻 而不是新的日期(“2015-10-10 00:30:00Z”) 你可以做片刻(“2015-10-10 00:30:00Z”) 希望这会有所帮助

【讨论】:

【参考方案2】:

我不认为使用 javascript 在 MySQL 中保存日期时间是一个好主意。我认为最好使用 MySQL 函数UTC_TIMESTAMP()。例如:

INSERT INTO `ITEMS` (`name`, `date_add`) VALUES ('item name', UTC_TIMESTAMP());

现在,当您从 MySQL 检索 UTC 日期时间时,您可以将其转换为 Moment 对象,如下所示:

var utc = moment.utc(MYSQL_DATETIME, 'YYYY-MM-DD HH:mm:ss');
var local = utc.local();
// var local = moment.utc(MYSQL_DATETIME, 'YYYY-MM-DD HH:mm:ss').local();
console.log( local.format("HH:mm:ss") );   // 15:54:31
console.log( local.fromNow() );            // a minute ago   

我在您的代码中没有发现任何问题。也许是应用程序端的东西(php?)。

另一件事。使用不带参数的方法 utc() 与调用 utc(new Date()) 相同。因此,您可以在转换为 MySQL 日期时间时简单地使用它:

//moment.utc(new Date()).format("YYYY-MM-DD HH:mm:ss")
moment.utc().format("YYYY-MM-DD HH:mm:ss")

注意:请原谅我的英语不好。

【讨论】:

以上是关于将存储在mysql(utc格式)中的momentjs datetime格式化为Local DateTime的主要内容,如果未能解决你的问题,请参考以下文章

在momentjs中处理DST的问题

如何将MySQL Datetime UTC转换为实际时区

如何在 MySQL 数据库中存储 UTC ISO8601 日期?

在 PHP/MySQL 中将日期时间存储为 UTC

JS 将UTC时间转为本地时间

MySQL默认时间格式是UTC还是GMT?