当前位置: 首页 > 知识库问答 >
问题:

是否强制datepicker react小部件使用UTC?

宦宏爽
2023-03-14

我尝试了以下帖子中的建议,并查看了Moment.js转换日期UTC给出错误日期的文档

moment.utc('Wed Sep 08 1999 00:00:00 GMT+0100').toJSON()

但最终结果是结果为1999-09-07T23:00:00.000z,因此没有存储正确的输入日期。

我现在正在使用以下formatDate函数格式化日期。但是,当我将计算机上的时区更改为智利时,日期1999-09-07 GMT-0200变为1999-09-08T00:00:00.000Z。

const formatDate = (v) => {
  console.log(v)
  const date = moment(v).format('YYYY-MM-DD')
  console.log(moment.utc(date).toJSON())
  return moment.utc(date).toJSON()
}

是不是我错过了什么?

共有1个答案

喻昀
2023-03-14

我尝试了这个问题的不同变通方法,但在最后,您可以找到我创建的最可行的变通方法,如下所示。

这个变体的主要思想是在输入字段内部显示想要的TZ,但在日历和时间列表内部显示本地TZ。

如能得到您的反馈,我将不胜感激。

import React, { useState, useMemo, useCallback } from 'react';
import moment from 'moment-timezone';
import DateTimePickerOrigin from 'react-widgets/lib/DateTimePicker';

const monthShortNames = [
  'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
  'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',
];

const dayShortNames = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];

const DateTimePicker = (props) => {
  const {
    tz, // <-- tz you want to display, eg 'Etc/UTC'
    min,
    max,
    value,
    onChange,
    ...tail
  } = props;

  const [localTz] = useState(moment.tz.guess());

  const fixedParse = useCallback(
    (dateStr) => (dateStr ? new Date(dateStr) : null),
    [],
  );

  const fixedFormat = 'MMM D, YYYY HH:mm z';

  const fixedTimeFormat = useCallback(
    (date) => {
      if (localTz !== tz) {
        return `${moment.tz(date, localTz).format('HH:mm z')} (${moment.tz(date, tz).format('HH:mm z')})`;
      }
      return moment.tz(date, localTz).format('HH:mm');
    },
    [tz, localTz, fixedFormat],
  );

  const fixedDateFormat = useCallback(
    (date) => String(date.getDate()),
    [],
  );

  const fixedYearFormat = useCallback(
    (date) => String(date.getFullYear()),
    [],
  );

  const fixedMonthFormat = useCallback(
    (date) => monthShortNames[date.getMonth()],
    [],
  );

  const fixedDayFormat = useCallback(
    (date) => dayShortNames[date.getDay()],
    [],
  );

  const fixedMin = useMemo(
    () => (min === null ? undefined : min),
    [min],
  );

  const fixedMax = useMemo(
    () => (max === null ? undefined : max),
    [max],
  );

  return (
    <DateTimePickerOrigin
      {...tail}
      parse={fixedParse}
      format={fixedFormat}
      timeFormat={fixedTimeFormat}
      dateFormat={fixedDateFormat}
      yearFormat={fixedYearFormat}
      monthFormat={fixedMonthFormat}
      dayFormat={fixedDayFormat}
      min={fixedMin}
      max={fixedMax}
      value={value}
      onChange={onChange}
    />
  );
};
 类似资料:
  • 我试图在flutter中创建一个布局,由一行和两个子小部件组成,第一个子部件向左对齐,第二个子部件向右对齐,如果容器太窄,这也将包装小部件。 这类似于这里提出的问题:Flutter将两个项极端地对齐--一个在左边,一个在右边,这可以通过小部件来解决,小部件具有。然而,当小部件使用此方法包装时,包装到新运行的右小部件不再右对齐。(截图) 我希望发生的是,右边的小部件在包装时保持与右边对齐。在使用fl

  • 在crosswalk中,可以使用cordova插件 而cordova inAppBrowser似乎工作得很好。但它仍然使用旧的android浏览器,而不是crosswalk chromium(因此不支持所需的HTML5功能)。 我可以通过检查user-agent(例如:

  • 问题内容: 在浏览器中,如果从调用的函数中使用,则将强制执行至少4ms的延迟。Mozilla的开发人员Wiki 描述了此行为,并提到该行为已在HTML5中标准化。 Node.js的文档未提及最小延迟。但是,该函数的文档将其描述为的更有效的替代方法。这表明它有更高的效率,因为它避免了这种延迟。否则可能会被优化以表现出相同的行为。 是否像网络浏览器一样,Node.js对setTimeout实施了最小延

  • 问题内容: 当我使用fputcsv将行写出到打开的文件句柄时,PHP会将封闭字符添加到它认为需要的任何列中,而其他列将不包含任何封闭物。 例如,您可能会得到这样的一行 除了在每个字段的末尾添加虚假空格之外,是否有任何方法可以强制fputcsv始终将列包含在外壳中(默认为“”)? 问题答案: 不,fputcsv()仅在以下情况下封闭该字段 没有“始终封闭”选项。

  • 在Hibernate中,要指定用于加入关联的列,请使用@JoinCol列注释,例如: 在大多数情况下,列的名称是用大写的类名加上。因此,从Hibernate自动派生它是合理的(例如,在Django的ORM中就是这样做的)。但这样的行为是以某种方式实施的吗?

  • 我现在已经切换到Android Studio,并用源代码树在Git中保存我的项目。每当我从模块中添加或删除任何库时,它的.iml文件也会更改。如果我提交*.iml真的无关紧要,因为它们是在其他Android Studio中自动生成的。但是,在这里它说您应该存储*.iml。我的问题是,我们真的需要和别人分享我们的*.iml吗?若有,原因为何?