简体   繁体   English

antd datePicker中showTime属性的defaultValue无法设置时间

[英]defaultValue of showTime attribute in antd datePicker couldn't set the time

I'm using ant design for my react hook based development.我正在使用 ant 设计进行基于反应挂钩的开发。 I am retrieving date from database over a network call and the date retrieved from database is look like "2020-09-01T05:02:00.000+0000".我正在通过网络调用从数据库中检索日期,从数据库中检索的日期看起来像“2020-09-01T05:02:00.000+0000”。 It is a string.它是一个字符串。 I have to parse this date and show the date value and time value through antd datePicker in my page.我必须在我的页面中通过 antd datePicker 解析这个日期并显示日期值和时间值。 Though I've success with setting up date part but I'm stuck with setting up the time.虽然我已经成功设置了日期部分,但我坚持设置时间。 Here is my code,这是我的代码,

########### Here is my datepicker ########### ########### 这是我的日期选择器###########

                          <DatePicker
                            name="Campaign-date"
                            defaultValue={moment(formData['Campaign-date'].split('T')[0])}
                   
                            showTime={{
                                defaultValue: moment(formData['Campaign-date'].split('T')[1],'HH:mm'),
                                format: 'HH:mm'
                                
                            }}
                            format={'YYYY-MM-DD HH:mm'}
                            style={{ width: '100%' }}
                            onChange={handleDateChange}
                        />

########################## Here is my handleDateChange function ########################## ######################### 这是我的handleDateChange function ################## #######

const handleDateChange = date => {
    setFormdata({
        ...formData,
        'Campaign-date': date
            .format('YYYY-MM-DD HH:mm')
            .split(' ')
            .join('T')
    });
};

formData['Campaign-date'] is the date retrieved from the database. formData['Campaign-date']是从数据库中检索到的日期。 I feel the showTime attribute is not working as expected.我觉得showTime属性没有按预期工作。 I want to get a result of "05:02" but instead the value shown is, "00:00".我想得到“05:02”的结果,但显示的值是“00:00”。

I have tried different variation in showTime such as,我尝试了 showTime 的不同变化,例如,

defaultValue: moment('05:02','HH:mm'),
//or
defaultValue: moment(formData['Campaign-date'],'HH:mm')
//or
defaultValue: moment(formData['Campaign-date'].split('T')[1].split('.),'HH:mm')

but nothing is working.但没有任何工作。 It is always setting the value as "00:00".它始终将值设置为“00:00”。 And I have no problem with my onChange functionality.我的 onChange 功能没有问题。 It is working perfect.它工作完美。 The date/time change code wise working as expected.日期/时间更改代码按预期工作。 It is just the view on my page is not showing correct time.只是我页面上的视图没有显示正确的时间。

I'm really stuck with.我真的很坚持。 Any help therefore, is much appreciated.因此,非常感谢任何帮助。

<DatePicker
      name="Campaign-date"
      defaultValue={moment(formData['Campaign-date'].split('T')[0])}
               
      showTime={{
              defaultValue: moment(formData['Campaign-date'].split('T')[1].split('.')[0],'HH:mm:ss'),
              format: 'HH:mm:ss'
                            
                        }}
      format={'YYYY-MM-DD HH:mm'}
      style={{ width: '100%' }}
      onChange={handleDateChange}
      />

Ant Design DatePicker: Ant 设计日期选择器:

( sandbox ) 沙箱

import React from "react";
import ReactDOM from "react-dom";
import { DatePicker, Space } from "antd";
import moment from "moment";

import "./index.css";
import "antd/dist/antd.css";

const initialState = {
  data1: "form field",
  data2: "form field 2",
  "Campaign-date": "2020-09-01T05:02:00.000+0000"
};

function FormComponent() {
  const [formData, setFormData] = React.useState(initialState);

  console.log(formData);

  function onChange(value, dateString) {
    if (value) {
      setFormData({
        ...formData,
        "Campaign-date": value.toISOString(true)
      });
    }
    //console.log("Selected Time: ", value); //Moment object
    //console.log("Formatted Selected Time: ", dateString); //String
  }

  return (
    <Space direction="vertical" size={12}>
      <DatePicker
        name="Campaign-date"
        defaultValue={moment(formData["Campaign-date"], "YYYY/MM/DD HH:mm")}
        format={"YYYY/MM/DD HH:mm"}
        showTime={{ format: "HH:mm" }}
        onChange={onChange}
      />
      <div style={{ marginTop: 16 }}>
        Selected Date:{" "}
        {formData["Campaign-date"]
          ? moment(formData["Campaign-date"]).format("YYYY-MM-YY HH:mm")
          : "None"}
      </div>
    </Space>
  );
}

ReactDOM.render(<FormComponent />, document.getElementById("container"));

If you are using react-datepicker 2.0 or up, you need to use a javascript Date object.如果您使用 react-datepicker 2.0 或更高版本,则需要使用 javascript 日期 object。 Here is a working setup.这是一个工作设置。

  function parseISOString(s) {
    var b = s.split(/\D+/);
    return new Date(Date.UTC(b[0], --b[1], b[2], b[3], b[4], b[5], b[6]));
  }

  const isoString = '2020-09-01T05:02:00.000+0000';
  const dateFromISOString = parseISOString(isoString);
  
  <DatePicker
    selected={dateFromISOString}
    dateFormat="dd/MM/yyyy HH:mm"
    showTimeSelect
    timeFormat="HH:mm"
    timeIntervals={15}
    placeholderText="Select date"
    onChange={handleChange}
  />

Overview概述

The string you are receiving from the database is an ISO date string.您从数据库接收的字符串是 ISO 日期字符串。

You can use moment.js to easily parse it or parse it manually and create a new Date object from it.您可以使用 moment.js 轻松解析它或手动解析它并从中创建一个新的 Date object。 Here is a snippet illustrating both.这是说明两者的片段。 The Date example uses this answer: Change ISO Date String to Date Object - JavaScript日期示例使用此答案: Change ISO Date String to Date Object - JavaScript

 const isoString = "2020-09-01T05:02:00.000+0000" // with Moment console.log("With Moment"); const timeFromMoment = moment(isoString).format("HH:mm"); console.log(timeFromMoment); // with Date console.log("With Date"); // https://stackoverflow.com/questions/27012854/change-iso-date-string-to-date-object-javascript function parseISOString(s) { var b = s.split(/\D+/); return new Date(Date.UTC(b[0], --b[1], b[2], b[3], b[4], b[5], b[6])); } const dateFromISOString = parseISOString(isoString); console.log(dateFromISOString); // return Local adusted time const localHours = dateFromISOString.getHours(); console.log(localHours); // return UTC time const utcHours = dateFromISOString.getUTCHours(); console.log(utcHours);
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js"></script>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM