Javascript 如何在simple React应用程序中优化此if-else块以比较日期

Javascript 如何在simple React应用程序中优化此if-else块以比较日期,javascript,reactjs,optimization,Javascript,Reactjs,Optimization,我正在学习如何反应。这是一个获取假JSON数据并填充表的简单项目。在这里,我试图比较日期,并检查该对象的生日是否是今年的今天 import React, { Component } from "react"; class Birthday extends Component { constructor(props) { super(props); this.verifyBirthday = this.verifyBirthday.bind(this); } ve

我正在学习如何反应。这是一个获取假JSON数据并填充表的简单项目。在这里,我试图比较日期,并检查该对象的生日是否是今年的今天

import React, { Component } from "react";

class Birthday extends Component {
  constructor(props) {
    super(props);

    this.verifyBirthday = this.verifyBirthday.bind(this);
  }

  verifyBirthday(date) {
    let today = new Date();
    let bDate = new Date(date);
    let todayDate = today.getDate();
    let bDateDate = bDate.getDate();
    let todayMonth = today.getMonth();
    let bDateMonth = bDate.getMonth();
    let msg = "";
    if (todayMonth < bDateMonth) {
      msg = "has yet to occur";
    } else if (todayMonth > bDateMonth) {
      msg = "already happened";
    } else {
      if (todayDate < bDateDate) {
        msg = "has yet to occur";
      } else if (today > bDateDate) {
        msg = "already happenned";
      } else {
        msg = "it's today!";
      }
    }

    return msg;
  }

  render() {
    let birthdayStatus = this.verifyBirthday(this.props.date);
    //console.log(typeof birthdayStatus);
    //console.log(birthdayStatus);
    return <span> {birthdayStatus} </span>;
  }
}

export default Birthday;
import React,{Component}来自“React”;
类扩展组件{
建造师(道具){
超级(道具);
this.verifybirth=this.verifybirth.bind(this);
}
核实生日(日期){
让今天=新日期();
设bDate=新日期(日期);
让todayDate=today.getDate();
让bDateDate=bDate.getDate();
让todayMonth=today.getMonth();
设bDateMonth=bDate.getMonth();
让msg=“”;
如果(今天月bDateMonth){
msg=“已经发生”;
}否则{
如果(今天日期b日期){
msg=“已经发生”;
}否则{
msg=“今天!”;
}
}
返回味精;
}
render(){
让birthdayStatus=this.verifyBirthday(this.props.date);
//console.log(生日状态的类型);
//console.log(生日状态);
返回{birthdayStatus};
}
}
导出默认生日;
我尝试了MomentJs,但在这个案例中没有用,因为我收到的日期是这种格式的
“1972年8月1日星期二晚上8:45”

我必须把它转换成date对象,然后转换成moment,diff in moment对象不排除年份。需要比较日期,以检查生日是否发生在当前年份。

以下代码应满足您的要求:

函数compareDateWithoutTime(dateA,dateB){
设date1=新日期(dateA);
let date2=新日期(dateB);
日期1.设定时间(0,0,0,0);
日期1.setFullYear(1969);//任何一年都可以
日期2.设定时间(0,0,0,0);
日期2.整年(1969年);
返回日期2.getTime()-date1.getTime();
}
函数为MyBirthday(生日){
让birthsDayCompare=comparedatewithout time(
生日,
新日期()
);
返回birthsDayCompare===0
“是今天!”
:birthsDayCompare>0
“已经发生了”
:“尚未发生”;
}
console.log(
'2020-03-10 01:00:34',
isItMyBirthday('2021-03-10 01:00:34')
);
console.log(
'2000-03-10 01:00:34',
isItMyBirthday('2000-03-10 01:00:34')
);

log(new Date(),isItMyBirthday(new Date())如果仍要使用momentjs,可以设置对象生日的年份,并使用isAfter、isBefore和isSame函数

function verifyBirthday(date) {
  const newdate = moment(date).startOf('day').set('year', moment().get('year'));

  return moment().startOf('day').isAfter(newdate) ? "already happenned" : moment().isBefore(newdate) ? "has yet to occur" : "it's today!";
};
您可以使用它有一个非常好的方法,可以使用
DDDD
和时间
h:mm a
格式解析日期格式

令牌
DDDD

说明:带有完整月份和工作日的本地化日期

示例:2014年8月6日,星期三

您可以查看以了解更多详细信息

React解析和siplaying示例:
从“luxon/build/node/luxon”导入{DateTime};
常数数据=[{
“姓名”:“尼克”,
“dob”:“1972年8月1日星期二晚上8:45”
}, {
“姓名”:“乔治”,
“dob”:“1980年3月10日星期一下午3:24”
}, {
“姓名”:“格雷戈里”,
‘dob’:‘1997年3月19日星期三下午7:10’
}, {
“姓名”:“玛丽亚”,
“dob”:“1964年3月20日星期五晚上9:37”
}, {
'姓名':'丽莎',
“dob”:“1974年3月21日星期四晚上9:37”
}];
...
renderItem({name,dob}){
const dateof birth=DateTime.fromFormat(dob,“ddddh:mm a”);
const now=DateTime.local();
const hassbirth=dateOfBirth.month===now.month&&dateOfBirth.day===now.day;
返回(
{name}
{dateof birth.toFormat(“EEE d,MMM y”)}
{生日快乐?生日快乐!:null}
);
}
render(){
返回(
我有生日
{this.state.data.map(d=>this.renderItem(d))}
);
}

检查此工作示例:

您能否澄清优化if-else黑色的含义。你到底想做什么?我为所有回答的人更新了这个问题,我需要根据JSON文件中的生日礼物检查所有这个对象的生日是否发生在今年。不管他们出生在哪一年,我都需要看看他们今年是否过生日。假设date1是今天,那么过去是
(date1.getTime()-date2.getTime())>0
,将来是
(date1.getTime()-date2.getTime())<0
(date1.getTime()-date2.getTime())===0
今天添加了额外的函数,以使其更加清晰。。。。对于你的情况,我更新问题。我想知道这些生日今年是否已经发生了。不管是哪一年,他们都是出生的。@user1319417请查看我的编辑w/date1.setFullYear(),覆盖年份以解决问题。。