设置时区React-Datepicker

Mar*_*ode 13 reactjs react-datepicker

我正在使用react-datepicker让用户选择日期.但是,现在它使用本地时间(PDT),但我想硬编码它以使用特定的时区(PST).

我尝试使用utcOffset道具,但它似乎没有做任何事情.有谁知道如何做到这一点?

小智 6

就我而言,我在渲染 React-dates 插件之前设置了 defaultTimezone。React-dates 将仅使用默认时区。

moment.tz.setDefault('America/Los_Angeles');
Run Code Online (Sandbox Code Playgroud)


Mar*_*tak 5

这对我有用:

import React, { ComponentProps } from "react"
import DatePicker from "react-datepicker"
import moment from "moment"

interface Props {
  timezone: string
}

const DatePickerWithTimezone = ({
  selected,
  onChange,
  timezone,
  ...props
}: Props & ComponentProps<typeof DatePicker>) => (
  <DatePicker
    selected={selected ? setLocalZone(selected, timezone) : null}
    onChange={(v, e) => {
      onChange(v ? setOtherZone(v, timezone) : null, e)
    }}
    {...props}
  />
)

const setLocalZone = (date: Date, timezone: string) => {
  const dateWithoutZone = moment
    .tz(date, timezone)
    .format("YYYY-MM-DDTHH:mm:ss.SSS")
  const localZone = moment(dateWithoutZone).format("Z")
  const dateWithLocalZone = [dateWithoutZone, localZone].join("")

  return new Date(dateWithLocalZone)
}

const setOtherZone = (date: Date, timezone: string) => {
  const dateWithoutZone = moment(date).format("YYYY-MM-DDTHH:mm:ss.SSS")
  const otherZone = moment.tz(date, timezone).format("Z")
  const dateWithOtherZone = [dateWithoutZone, otherZone].join("")

  return new Date(dateWithOtherZone)
}

export default DatePickerWithTimezone
Run Code Online (Sandbox Code Playgroud)

  • 好的!如果您使用提供 `convertToLocalTime(date, { timeZone: timezone })` 和 `convertToTimeZone(date, { timeZone: timezone })` 的 `date-fns-timezone` 库,它的工作方式基本上相同你的“setLocalZone”和“setOtherZone”函数就是这样做的。 (3认同)

小智 5

由于 datepicker 不再使用 moment.js 我尝试为这个问题实现一个 hacky 解决方案,假设初始值是一个字符串,例如:

export const formatUTC = (dateInt, addOffset = false) => {
    let date = (!dateInt || dateInt.length < 1) ? new Date : new Date(dateInt);
    if (typeof dateInt === "string") {
        return date;
    } else {
        const offset = addOffset ? date.getTimezoneOffset() : -(date.getTimezoneOffset());
        const offsetDate = new Date();
        offsetDate.setTime(date.getTime() + offset * 60000)
        return offsetDate;
    }
}
Run Code Online (Sandbox Code Playgroud)

在日期内我这样调用格式化程序:

selected={formatUTC(this.props.input.value,true)}
                    onChange={date => formatUTC(date)}
Run Code Online (Sandbox Code Playgroud)


Dom*_*nic -1

我也没有运气utcOffset。您可以moment-timezone在您的项目中使用而不是moment自己转换它:

import moment from "moment-timezone";

onDateChange = date => {
  console.log("as is:", date.format("YYYY-MM-DD HH:mm:ss"));
  console.log("PST:", moment(date).tz("America/Los_Angeles").format("YYYY-MM-DD HH:mm:ss"));
};
Run Code Online (Sandbox Code Playgroud)

沙箱:https://codesandbox.io/s/y2vwj9mwpz