如何将 Moment.js 日期转换为用户本地时区?

Posted

技术标签:

【中文标题】如何将 Moment.js 日期转换为用户本地时区?【英文标题】:How to convert Moment.js date to users local timezone? 【发布时间】:2015-05-27 01:06:30 【问题描述】:

我使用 Moment.js 和 Moment-Timezone 框架,并且有一个 Moment.js 日期对象,它明确地在 UTC 时区中。如何将其转换为浏览器的当前时区?

var testDateUtc = moment.tz("2015-01-30 10:00:00", "UTC"); var localDate = ???

所以如果我能找出用户的本地时区就好了;或者,我想将日期对象转换为另一个只使用“本地时区”的数据对象,不管它实际上是什么。

【问题讨论】:

【参考方案1】:

您不需要为此使用时刻时区。主要的 moment.js 库具有使用 UTC 和本地时区的完整功能。

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).local();

从那里您可以使用您可能期望的任何功能:

var s = localDate.format("YYYY-MM-DD HH:mm:ss");
var d = localDate.toDate();
// etc...

请注意,通过将testDateUtc(一个moment 对象)传递回moment() 构造函数,它会创建一个克隆。否则,当您调用.local() 时,它也会更改testDateUtc 值,而不仅仅是localDate 值。时刻是可变的

另请注意,如果您的原始输入包含时区偏移量,例如+00:00Z,那么您可以直接使用moment 对其进行解析。您不需要使用.utc.local。例如:

var localDate = moment("2015-01-30T10:00:00Z");

【讨论】:

你应该知道这个方法没有考虑夏令时偏移,使用moment-timezone库更安全 @Jaime 不正确。 local 确实考虑了夏令时。 您可以自行检查,例如将EST 翻译成CET,如果您想要NY->Madrid,明天我会举个例子。我会接受反例:) 你是对的,没有时刻时区,时刻无法进行那种类型的转换。但是,它可以在 UTC 和本地之间正确转换,这是 OP 所要求的。 本地规则来自浏览器。所以只要本地时区包含夏令时,moment就会使用它。【参考方案2】:

使用 utcOffset 函数。

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).utcOffset(10 * 60); //set timezone offset in minutes
console.log(localDate.format()); //2015-01-30T20:00:00+10:00

【讨论】:

【参考方案3】:
var dateFormat = 'YYYY-DD-MM HH:mm:ss';
var testDateUtc = moment.utc('2015-01-30 10:00:00');
var localDate = testDateUtc.local();
console.log(localDate.format(dateFormat)); // 2015-30-01 02:00:00
    定义您的日期格式。 创建一个时刻对象并将对象上的 UTC 标志设置为 true。 创建从原始矩转换而来的本地化矩对象 目的。 从本地化的时刻对象返回一个格式化的字符串。

见:http://momentjs.com/docs/#/manipulating/local/

【讨论】:

这个答案会更好,如果它解释了为什么会这样,也许参考文档。此外,您可能想解释一下这个答案与三月份发布的答案有何不同...... @AndrewHenderson,时间比本地机器时间早一小时。为什么会这样? @RameshPapaganti 也许是夏令时?例如 PDT 与 PST。众所周知,Moment 会更改版本之间的 API,尤其是在本地化方面。如果您找到原因,请告诉我。【参考方案4】:

这就是我所做的:

var timestamp = moment.unix( time );
var utcOffset = moment().utcOffset();
var local_time = timestamp.add(utcOffset, "minutes");
var dateString = local_time.fromNow();

time 是 UTC 时间戳

【讨论】:

【参考方案5】:

class Time extends React.Component 
  constructor(props) 
    super(props)
    this.state = 
      parentTime: '',
      localTime: '',
      parentTz: ''
    
  

  componentDidMount() 
    const inputTz = "America/Toronto"
    const originTime = "2013-11-18 11:55"
    const time = moment.tz(originTime, inputTz)
    const localtz = moment.tz.guess()
    const date = time.clone().tz(localtz)
    const formatDate = moment(date).format('MMMM Do YYYY, h:mm:ss A z')
     console.log(formatDate, localtz)
    this.setState(parentTime: originTime, localTime: formatDate, parentTz: inputTz )
  


  render() 
  const parentTime, parentTz, localTime = this.state
    return (
      <div>
      <p>parentTime<br/> in parentTz<br/> to localTime</p>
      </div>
    )
  



ReactDOM.render(
  <Time />,
  document.getElementById('time')
);
<script src="https://momentjs.com/downloads/moment.js"></script>
<script src="https://momentjs.com/downloads/moment-timezone.js"></script>
<script src="https://momentjs.com/downloads/moment-timezone-with-data-1970-2030.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/15.3.0/react-dom.min.js"></script>
<div id="time"></div>

获取用户时区的最佳方法是使用 moment-timezone

import moment from 'moment-timezone'

// using utc time here
const time = moment.tz("2021-04-14T02:08:10.370Z")
const localtz = moment.tz.guess()
const date = time.clone().tz(localtz)
const formatDate = moment(date).format('MMMM Do YYYY, h:mm:ss A z')
console.log(formatDate)

这样您就可以将您的时间转换为当地时区的特定时间

【讨论】:

moment.tz 不存在 @huykon225 它确实存在。这不是时刻包,而是“时刻-时区” time 是 moment-timezone 包的一部分还是另一个包? @stt106 再仔细看看,time 只是一个变量的名字

以上是关于如何将 Moment.js 日期转换为用户本地时区?的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 moment.js 中转换 RFC2822 日期时出现“弃用警告:时刻构造回退到 js 日期”

将本地时间转换为用户首选时区,将用户首选时区转换为 GMT

将 GMT 日期时间转换为本地时区日期时间

使用moment.js解析时如何忽略时区

使用 joda time 将一个时区转换为另一个时区

在 VBA 中,如何以简单的方式将 UTC UNIX 时间戳转换为本地时区日期?