Javascript 如何更改GraphQL时间的时区?
我发现了很多关于使用Date()和获取时区的好信息,但是有些东西不起作用。我将GraphQL(从Sanity中获取)设置为使用formatString,如下所示:Javascript 如何更改GraphQL时间的时区?,javascript,graphql,timezone,sanity,Javascript,Graphql,Timezone,Sanity,我发现了很多关于使用Date()和获取时区的好信息,但是有些东西不起作用。我将GraphQL(从Sanity中获取)设置为使用formatString,如下所示: export default function MinutesItemGrid() { const { minutes } = useStaticQuery(graphql` query { minutes: allSanityMinutes { nodes { endTim
export default function MinutesItemGrid() {
const { minutes } = useStaticQuery(graphql`
query {
minutes: allSanityMinutes {
nodes {
endTime(formatString: "h:mma [on] MM/DD/YYYY")
}
}
}
`);
然后在.map
中调用它:
const allMinutes = minutes.nodes;
return (
<CardStyles>
{allMinutes.map((minute) => (
<ItemStyles>
<div className="card" key={minute.id}>
<div className="content">Meeting began at: {minute.endTime}</div>
</div>
</ItemStyles>
))}
</CardStyles>
);
const allMinutes=minutes.nodes;
返回(
{allMinutes.map((分钟)=>(
会议开始于:{minute.endTime}
))}
);
显示为2020年10月14日晚上11:33。这比实际情况提前了6个小时
我知道这是标准的UTC时间返回。我知道如何获取本地时间偏移量(
new Date().getTimezoneOffset();
)和本地时区(Intl.DateTimeFormat().resolvedOptions().timezone
),但我看不到将时区更改为MST(或本地时间)而不是UTC的选项。我试过用各种方法减去6小时,试过使用moment.js和moment.js时区根据他们的文档更改时区。我刚刚发现Luxon现在是一个更好的选择,但即使在他们的文档中,我也看不到从GraphQL中提取数据的解决方案。如果您计划使用Luxon,您可以使用DateTime将DateTime转换并格式化为任何给定时区
例如,MDT是UTC-6。因此,将datetime转换为ISO字符串格式
import { DateTime } from "luxon"
DateTime.fromISO(datetime, { zone: 'utc-6' }).toString()
这会将MDT区域中的日期时间输出为
2021-04-21T07:36:04.529-06:00
经过多次尝试,我发现了答案
&错误,以防这对将来的任何人都有帮助。我遇到的问题是:endTime(formatString:“h:mma[on]MM/DD/YYYY”)
这样做的目的是在调用DateTime.from(minute.endTime,{zone:'utc-6',})之前格式化字符串,使其返回无效条目,因为.fromso
需要这种格式2020-10-14T17:33:00.000
。一旦我删除了,除了格式之外,一切都很好,我发现没有使用.toString()
方法,而是使用.toFormat()
方法。这是我原来问题的修正代码:
export default function MinutesItemGrid() {
const { minutes } = useStaticQuery(graphql`
query {
minutes: allSanityMinutes {
nodes {
endTime
}
}
}
`);
然后.map
在图形ql上:
const allMinutes = minutes.nodes;
return (
<CardStyles>
{allMinutes.map((minute) => {
const endMDT = DateTime.fromISO(minute.endTime, {
zone: 'utc-6',
}).toFormat('h:mma MM/dd/yyyy');
<ItemStyles>
<div className="card" key={minute.id}>
<div className="content">Meeting began at: {endMDT}</div>
</div>
</ItemStyles>
))}
</CardStyles>
const allMinutes=minutes.nodes;
返回(
{allMinutes.map((分钟)=>{
const endMDT=DateTime.fromISO(minute.endTime{
区域:“utc-6”,
}).toFormat('h:mma MM/dd/yyyy');
会议开始于:{endMDT}
))}
)感谢您回复@Y.S。这肯定让我走上了正确的道路。我不明白的一件事是如何在DateTime内使用我的GraphQL作为参数。在您的示例中,DateTime似乎是GraphQL参数,但我有两个GraphQL参数要声明:endTime&meetingStart。我肯定必须在DateTime内声明它我的函数,因此GraphQL是可引用的;但是,如果我在.map
之外执行此操作,它将返回未定义,如果我在.map
内执行此操作,它将中断。我出了什么错?是否需要将此位放入我的Sanity或Gatsby文件夹中?