【问题标题】:How to convert Moment.js date to users local timezone?如何将 Moment.js 日期转换为用户本地时区?
【发布时间】: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 = ???

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

【问题讨论】:

    标签: javascript date timezone momentjs


    【解决方案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
      
      1. 定义您的日期格式。
      2. 创建一个时刻对象并将对象上的 UTC 标志设置为 true。
      3. 创建从原始矩转换而来的本地化矩对象 目的。
      4. 从本地化的时刻对象返回一个格式化的字符串。

      见: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 只是一个变量的名字
        猜你喜欢
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-14
        • 1970-01-01
        • 1970-01-01
        • 2018-01-07
        • 2020-09-08
        相关资源
        最近更新 更多