Javascript 如何更改GraphQL时间的时区?

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

我发现了很多关于使用Date()和获取时区的好信息,但是有些东西不起作用。我将GraphQL(从Sanity中获取)设置为使用formatString,如下所示:

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文件夹中?