如何将 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:00
或Z
,那么您可以直接使用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 日期转换为用户本地时区?的主要内容,如果未能解决你的问题,请参考以下文章