【问题标题】:Trying to convert React JS new Date() output to date-fns formatISO尝试将 React JS new Date() 输出转换为 date-fns formatISO
【发布时间】:2021-09-19 17:12:41
【问题描述】:

我正在开发一个从用户那里收集事件数据条目的应用程序。我的数据结构很简单

const dummyEvent = JSON.parse(
  '{"id":0,"notes":"","date_time":""}'
);

日期部分有一个弹出窗口,时间部分有另一个弹出窗口。捕获的数据需要存储在我的数据库中的 date_time 字段中。

当用户进入屏幕时,我必须使用“new Date()”将日期和时间默认为现在。用户可以使用弹出窗口来更改日期和时间值

我的问题是生成的 (new Date()) 格式如下 2021 年 7 月 9 日星期五 05:39:30 GMT-0400 (EDT) 我需要将它格式化为这个时区感知字符串 2021-07-09T05:39:30-04:00

正如您在我的单独测试代码中看到的那样,我使用 date-fns/formatISO 生成正确的格式。但是当我尝试将它设置到我的状态对象中时,它会抛出代码中注释的异常

import React, {useState} from 'react';
import { parse, parseDate, format, addDays, isAfter, formatISO, parseISO } from "date-fns";
import {StyleSheet, View, Text, Button, Platform} from 'react-native';

import DateTimePicker from '@react-native-community/datetimepicker';

const App = () => {
  const [isPickerShowDate, setIsPickerShowDate] = useState(false);
  const [myDate, setMyDate] = useState(new Date(Date.now()));

  const [isPickerShowTime, setIsPickerShowTime] = useState(false);

  const showPickerDate = () => {
    setIsPickerShowDate(true);
    setIsPickerShowTime(false);
  };
  
  const showPickerTime = () => {
    setIsPickerShowTime(true);
    setIsPickerShowDate(false);
  };

  const onChangeDate = (event, value) => {
    falseEmBoth();
    setMyDate(value);
  };
  const onChangeTime = (event, value) => {
  falseEmBoth();
    setMyDate(value);
  };

  const falseEmBoth = () => {
  setIsPickerShowTime(false);
  setIsPickerShowDate(false);
  console.log('\nIn falseEmBoth');
  };

  return (
    <View style={styles.container}>
      <View style={styles.pickedDateContainer}>
        <Text style={styles.pickedDate}>{format(myDate, 'P')}</Text>
      </View>
      <View style={styles.btnContainer}>
        <Button title="Show Date Picker" color="purple" onPress={showPickerDate} />
      </View>

      {isPickerShowDate && (
        <DateTimePicker
          value={myDate}
          mode={'date'}
          display={Platform.OS === 'ios' ? 'spinner' : 'default'}
          onChange={onChangeDate}
          style={styles.datePicker}
        />
      )}

      <View style={styles.pickedDateContainer}>
        <Text style={styles.pickedDate}>{format(myDate, 'p')}</Text>
      </View>
      <View style={styles.btnContainer}>
        <Button title="Show Time Picker" color="purple" onPress={showPickerTime} />
      </View>

      {isPickerShowTime && (
        <DateTimePicker
          value={myDate}
          mode={'time'}
          display={Platform.OS === 'ios' ? 'spinner' : 'default'}
          onChange={onChangeTime}
          style={styles.datePicker}
        />
      )}
      
      <View style={styles.pickedDateContainer}>
        <Text style={styles.pickedDate}>{ format(myDate, 'Pp') }</Text>
      </View>
      <View style={styles.pickedDateContainer}>
        <Text style={styles.pickedDate}>{ format(myDate, 'PPpp') }</Text>
      </View>

      <View style={styles.btnContainer}>
        <Button
          title="Log Date Value"
          onPress={() => {
            const t = format(myDate, 'yyyy-MM-dTHH:m:s-OOOO');
            const tt = formatISO(myDate);
//            const t = format(myDate, "yyyy-MM-dd'T'HH:mm:ssOOOO");
              //  above produces -- ERROR  RangeError: Invalid time value

//            const t = formatISO(myDate, "yyyy-MM-dd'T'HH:mm:ssOOOO");
//            const t = parseDate(myDate, "yyyy-MM-dd'T'HH:mm:ssOOOO", new Date());
            //  above produces --  ERROR  TypeError: (0, _$$_REQUIRE(_dependencyMap[5], "date-fns").parseDate) is not a function.

//            const t = parse(myDate, "yyyy-MM-dd'T'HH:mm:ssOOOO", new Date());
              //   above produces --  ERROR  RangeError: Invalid time value

            console.log('\nBefore myDate value: ' + myDate);
            console.log('format yyyy-MM-ddTHH:m:s-OOOO date value:\n' + t);
            console.log('formatISO tt date value:\n' + tt);

//            setMyDate(formatISO(new Date(myDate)));
              //  above produces --  above yields: Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO`

//            setMyDate(formatISO(new Date(date), { representation: 'complete' }));
//            setMyDate(format(myDate, 'yyyy-MM-ddTHH:m:s-OOOO'));

            setMyDate(t);
            console.log('After date value: ' + myDate);
          }}
        />
      </View>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    display: 'flex',
    flexDirection: 'column',
    alignItems: 'center',
    flex: 1,
    justifyContent: 'center',
    padding: 50,
  },
  pickedDateContainer: {
    padding: 20,
    backgroundColor: '#eee',
    borderRadius: 10,
  },
  pickedDate: {
    fontSize: 18,
    color: 'black',
  },
  btnContainer: {
    padding: 30,
  },
  // This only works on iOS
  datePicker: {
    width: 320,
    height: 260,
    display: 'flex',
    justifyContent: 'center',
    alignItems: 'flex-start',
  },
});

export default App;

感谢您的帮助。 珍妮 P.

【问题讨论】:

    标签: reactjs datetime timezone date-fns


    【解决方案1】:

    我缺少的是 myDate 不是一个日期对象,我以后可以像我们在 Java 中那样完全操作它,就像我们在 Java 中所做的那样。我需要在创建对象时应用 formatISO -

    const [myDate, setMyDate] = useState(formatISO(new Date()))
    

    【讨论】:

      猜你喜欢
      • 2021-01-07
      • 1970-01-01
      • 2021-01-17
      • 2021-12-22
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      相关资源
      最近更新 更多