我用Moment.js来解析和格式化我的网络应用程序中的日期.作为JSON对象的一部分,我的后端服务器从UTC历元(Unix偏移量)以毫秒为单位发送日期.

解析日期in a specific timezone很简单——只需在解析之前将RFC 822时区标识符附加到字符串的末尾:

// response varies according to your timezone
const m1 = moment('3/11/2012 13:00').utc().format("MM/DD HH:mm")

// problem solved, always "03/11 17:00"
const m2 = moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm")

console.log({ m1, m2 })
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

但是我如何格式化日期in a specifc timezone呢?

无论浏览器的当前时间如何,我都希望得到一致的结果,但我不希望以UTC显示日期.

推荐答案

正如Manto's answer中所指出的,从力矩2.9.0开始,.utcOffset()是首选方法.此函数使用UTC的实际偏移量,而不是反向偏移量(例如,DST期间纽约为-240).像"+0400"这样的偏移字符串的工作原理与之前相同:

// always "2013-05-23 00:55"
moment(1369266934311).utcOffset(60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).utcOffset('+0100').format('YYYY-MM-DD HH:mm')

在Moment.js2.9.0中,较老的.zone() as a setterdeprecated.它接受包含时区标识符的字符串(例如,"-0400"或"-04:00"表示-4小时)或表示behindUTC分钟的数字(例如,在DST期间,240表示纽约).

// always "2013-05-23 00:55"
moment(1369266934311).zone(-60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).zone('+0100').format('YYYY-MM-DD HH:mm')

要使用命名时区而不是数字偏移,请包含Moment Timezone,并使用.tz():

// determines the correct offset for America/Phoenix at the given moment
// always "2013-05-22 16:55"
moment(1369266934311).tz('America/Phoenix').format('YYYY-MM-DD HH:mm')

Javascript相关问答推荐

nPM审计始终发现0个漏洞

Cypress -使用commands.js将数据测试id串在一起失败,但在将它们串在一起时不使用命令有效

过滤对象数组并动态将属性放入新数组

为什么我的includes声明需要整个字符串?

传递一个大对象以在Express布局中呈现

基于变量切换隐藏文本

按下同意按钮与 puppeteer 师

如何粗体匹配的字母时输入搜索框使用javascript?

如何在Obsidian dataview中创建进度条

如何调用名称在字符串中的实例方法?

如何在Vue 3中创建自定义 Select 组件,并将选项作为HTML而不是props 传递?

我的角模板订阅后不刷新'

保持物品顺序的可变大小物品分配到平衡组的算法

如何在箭头函数中引入or子句?

VSCode中出现随机行

在FAQ Accodion应用程序中使用React useState时出现问题

当从其他文件创建类实例时,为什么工作线程不工作?

在Vercel中部署Next.js项目时获取`ReferenceError:未定义文档`

postman 预请求中的hmac/sha256内标识-从js示例转换

本地损坏的Java脚本