Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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中更改日期时区?_Javascript_Node.js_Date_Types_Momentjs - Fatal编程技术网

在Javascript中更改日期时区?

在Javascript中更改日期时区?,javascript,node.js,date,types,momentjs,Javascript,Node.js,Date,Types,Momentjs,我有一个UTC格式的日期'2020-06-19T03:55:12.000Z。现在我把美国时区的日期转换为 let syncDate=moment(日期'YYYY-MM-DD[T]HH:MM:ss.SSS[Z]')) .减去(7,‘小时’) .format('YYYY-MM-DD[T]HH:MM:ss.SSS[Z]”); 这给了我一个7小时后的日期,这是我们的日期。但我想要以下格式的日期 2020-06-18T21:00:24.523-07:00 在这里,如果我们可以看到小时数被定义为-7,

我有一个UTC格式的日期'2020-06-19T03:55:12.000Z。现在我把美国时区的日期转换为

let syncDate=moment(日期'YYYY-MM-DD[T]HH:MM:ss.SSS[Z]'))
.减去(7,‘小时’)
.format('YYYY-MM-DD[T]HH:MM:ss.SSS[Z]”);
这给了我一个7小时后的日期,这是我们的日期。但我想要以下格式的日期

2020-06-18T21:00:24.523-07:00 

在这里,如果我们可以看到小时数被定义为-7,那么请指导我们如何实现同样的目标?

您无法从日期中提取时区,因为其中没有时区信息。你说“我要把美国时区的日期转换为”但你没有。你只是减少了7个小时。时区仍然是UTC

你应该使用
时刻时区
(不要像@GetSet所说的那样,以艰难的方式手动处理事情)。以下是解决方案:

const moment = require('moment'); 
const tz = require('moment-timezone');

let date = moment('2020-06-19T03:55:12.000Z');
let syncDate = date.tz('America/Los_Angeles')
console.log(syncDate.format());
但是,我建议您使用
Day.js
。守则如下:

const dayjs = require('dayjs');
const utc = require('dayjs/plugin/utc');
dayjs.extend(utc);

const dDate = dayjs('2020-06-19T03:55:12.000Z');

console.log(dDate.utcOffset(-7*60).format()); //2020-06-18T20:55:12-07:00
我过去使用过
moment.js
。我试了24个小时。最后,我搬到了伦敦。它是新的(从2018年底开始),但它的发展速度非常快(并将持续时间定为5年)。它的伟大之处在于“它总是言行一致”。时间和日期fns没有。(并非总是如此)。它使用包装器,因此您永远不会直接使用日期对象。它解决了困难和问题。它是不可变的,总是返回一个新的对象,你可以链接函数。Day.js的大小最小(2kB)。文档非常棒,您可以快速启动和运行。(其他图书馆的工作方式更容易理解。)

在这里,我不得不说,
Dayjs
性能在计算中不如矩,但在解析和格式化方面要好得多(尤其是矩)

我强烈建议您阅读这篇文章:


编辑(1):正如@GetSet在Moment.js的评论中提到的,可能需要一个解决方案,我把它添加到了答案中

编辑(2):添加无法获得结果的原因,并以解决方法解决。

您可以使用
Date().toLocalString()
方法

// example:
var d = new Date().toLocalString("en-US", {
    month: "long",
    day: "2-digit",
    year: "numeric",
});
有关更多信息,请参阅:

  • new Date()
    取决于本地计算机的日期设置-如果任何用户在其本地计算机上有错误的日期-您的系统将从这些用户那里获取错误的日期
  • 如果您在后台处理日期(存储在数据库或任何其他操作中),请在后台(php、java等)生成日期,然后将其发送给html/javascript文件

  • 这里有几件事是非常重要的

  • 美国没有一个时区,有很多时区,例如美国/洛杉矶、美国/丹佛、美国/芝加哥、美国/纽约,请参阅所有时区

  • 请不要使用固定的偏移量从一个时区转换到另一个时区,这是非常脆弱的。你不会相信,由于这一个错误,我在我的职业生涯中看到了多少bug(来自他人,是的,来自我自己!)。许多时区都使用UTC,因此时区的UTC偏移量随日期而变化。例如,当前在UTC-08:00和UTC-07:00之间变化

  • 我建议使用从一个时区转换到另一个时区

    例如:

    const dateString=`2020-06-19T03:55:12.000Z`;
    常量时区=[“美国/纽约”、“美国/芝加哥”、“美国/丹佛”、“美国/洛杉矶”];
    log(`Time in UTC:`,moment(dateString.toISOString());
    //显示每个时区的时间
    timezones.forEach(时区=>{
    让timeLocal=moment.tz(日期字符串,时区);
    console.log(`Time in${timezone}:`,timeLocal.format('YYYY-MM-DD[T]HH:MM:ss.SSSZ'))
    });
    
    
    
    美国的datetime随美国时区的不同而变化,不固定在7,除非是这种情况。我不确定你是否意识到这一点。美国大约有5个时区可以查询。我还可以补充一点,以UTC为单位计算时间有一个优势;仅在格式化用于显示的时间或用于记帐的其他逻辑时,转换可以在不更改存储的UTC日期时间的情况下进行。关于您的问题,示例数据字符串(格式)
    2020-06-18T21:00:24.523-07:00
    有两个清晰的分隔符。第一个是
    T
    。第二个似乎有两个可能的值,一个是
    -
    +
    ,然后是与UTC的小时差。那么我们可以创建类似显示的格式吗?您可以通过简单或更复杂的方法创建模拟相同的函数。我刚刚重读了你的帖子,意识到你正在使用moment.js。在重新发明轮子之前,我会先检查他们的API文档。但在回顾中,我们在同一页上:第一个标记是UTC的日期,
    T
    之后的第二个标记是UTC的时间,
    -
    +
    之后的第三个标记是差异(将其带到目标时区)?OP可能依赖于矩.js;此外,在适用的情况下,OP可能愿意在探索竞争性API之前,进一步探索强调的问题。然而,在阅读代码块时,它似乎是正确的。不同之处在于(Day.js)给出的是小数形式的分数秒(乘以100?),而OP给出的是百分比形式的分数秒(<1)。好建议。我想向你建议,你应该在你的文章中预先添加一些内容,说明你为什么要进行编辑。这样评论就不会过时了。@GetSet对不起。但我不是以英语为母语的,你的写作方式让我有点难以理解OP是什么意思?(似乎这不是英语的问题,而是一个编程短语?!)OP指的是在这个网站上启动线程的人。OP=“原创海报”。发布问题的人。而“我们”不是OP。因此,作为一般规则,我们必须通过OP的反馈引导问题或评论,以进一步“帮助”理解实际问题。@GetSet Tnx!很多!:)你完全是对的。我把