繁体   English   中英

使用moment.js发出计算睡眠时间的问题,并做出本机反应。

[英]Issue calculating sleep time with moment.js and react native.

问题的详细屏幕截图

我正在尝试使用moment.js和这个日期时间选择器来计算本地反应的睡眠时间。 当我尝试时,结果始终为0,这是不正确的。

这是我在moment.js中使用的格式:moment.duration(moment(this.selectedEndDateTime).diff(moment(this.selectedStartDateTime)))。asHours()。

带有工作代码的小吃链接:

export default class DateTimePickerTester extends Component {

state = {
    startDateTimePickerVisible: false,
    endDateTimePickerVisible: false,
    selectedStartDateTime: moment().format('ddd MMM D YYYY 12:00 AM').toUpperCase(),
    selectedEndDateTime: moment().format('ddd MMM D YYYY 8:00 AM').toUpperCase(),
  };

  showStartDateTimePicker = () => this.setState({ startDateTimePickerVisible: true });
  showEndDateTimePicker = () => this.setState({ endDateTimePickerVisible: true });

  hideStartDateTimePicker = () => this.setState({ startDateTimePickerVisible: false });
  hideEndDateTimePicker = () => this.setState({ endDateTimePickerVisible: false });

  handleStartDateTimePicked = (datetime) => {
    this.setState({
        selectedStartDateTime: moment(datetime).format('ddd MMM D YYYY h:mm a').toUpperCase()
      })
    this.hideStartDateTimePicker();
  };

  handleEndDateTimePicked = (datetime) => {
    this.setState({
        selectedEndDateTime: moment(datetime).format('ddd MMM D YYYY h:mm a').toUpperCase()
      })
    this.hideEndDateTimePicker();
    this.displaySleepDuration()
  };

  displaySleepDuration = (datetime) => {
    this.setState({
      sleepDuration: moment.duration(moment(this.selectedEndDateTime).diff(moment(this.selectedStartDateTime))).asHours()
    })
  }

  render () {
    console.log( this.state.sleepDuration )
    return (
      <View style={{ flex: 1, margin: 50 }}>

        <Text style={{ fontWeight: 'bold', marginBottom: 10 }}>
           Time Slept: {this.state.sleepDuration}
        </Text>

        <TouchableOpacity onPress={this.showStartDateTimePicker}>
          <Text>
            In Bed: {this.state.selectedStartDateTime}
          </Text>
        </TouchableOpacity>

        <TouchableOpacity onPress={this.showEndDateTimePicker}>
          <Text>
            Awake: {this.state.selectedEndDateTime}
          </Text>
        </TouchableOpacity>

        <DateTimePicker
          mode='datetime'
          isVisible={this.state.startDateTimePickerVisible}
          onConfirm={this.handleStartDateTimePicked}
          onCancel={this.hideStartDateTimePicker}
        />

        <DateTimePicker
          mode='datetime'
          isVisible={this.state.endDateTimePickerVisible}
          onConfirm={this.handleEndDateTimePicked}
          onCancel={this.hideEndDateTimePicker}
        />
      </View>
    );
  }  
}

问题编号是指在提供的屏幕截图中分配的编号。

第1期

您对moment.duration()moment.diff()是正确的,但是,您引用的是未定义的对象:您必须引用状态属性:

this.setState({
  sleepDuration: moment.duration(  
    moment(this.state.selectedEndDateTime).diff(         // instead of this.selectedEndDateTime
    moment(this.state.selectedStartDateTime))).asHours() // instead of this.selectedStartDateTime
})

第2期

您正在尝试使用实际值格式化矩对象,这是无效的。 请参阅格式文档。

相反,您应该先对一下矩对象进行格式化,然后再进行格式化,如下所示:

selectedStartDateTime: moment().hours(0).minutes(0).format('ddd MMM D YYYY h:mm a').toUpperCase(),
selectedEndDateTime: moment().hours(8).minutes(0).format('ddd MMM D YYYY h:mm a').toUpperCase()

请注意正确的格式字符串,并且12 AM是0小时

第3期

您没有将初始时间设置为日期选择器。 属性文档说,您可以传递date属性来设置初始值:

 <DateTimePicker
   mode='datetime'
   datetime='12:00'
   isVisible={this.state.startDateTimePickerVisible}
   onConfirm={this.handleStartDateTimePicked}
   onCancel={this.hideStartDateTimePicker}
   date={moment().hours(0).minutes(0).toDate()}
 />

 <DateTimePicker
   mode='datetime'
   isVisible={this.state.endDateTimePickerVisible}
   onConfirm={this.handleEndDateTimePicked}
   onCancel={this.hideEndDateTimePicker}
   date={moment().hours(8).minutes(0).toDate()}
 />

暂无
暂无

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

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