uni-app uni-datetime-pick NAN 问题

uni-app uni-datetime-pick NAN 问题

开发环境 版本号 项目创建方式
Windows win10 HBuilderX

示例代码:

<uni-forms-item required class="uni-forms-item--border" name="happenedTime" label="事发时间"> <view class="uni-inline-item"> <uni-datetime-picker type="datetime" :border="false" v-model="form.happenedTime" style="text-align: right;"> </uni-datetime-picker> <image class="arrow-right" src="../../../static/img/arrow-right.png" /> </view> </uni-forms-item> ```

rules: { happenedTime: { rules: [{ required: true, errorMessage: ‘请选择事发时间’, trigger: ‘change’ }, { minLength: 10, errorMessage: ‘请选择事发时间’, }] }


### 操作步骤:


form表单默认不设置日期,然后设置该表单项必填, 点击表单校验 就会NAN,再次点击变成2000-01-01

预期结果:

不应该出现NAN


### 实际结果:


不应该出现NAN

bug描述:

安卓手 uni-forms表单校验uni-datetime-picker报NAN


更多关于uni-app uni-datetime-pick NAN 问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app uni-datetime-pick NAN 问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个典型的 uni-datetime-picker 组件在表单校验时遇到的 NAN 问题。问题核心在于组件初始值处理与表单校验规则的冲突。

问题分析:

  1. NAN 来源:当 uni-datetime-picker 的 v-model 绑定的值为 undefinednull 时,组件内部在特定条件下(尤其在安卓端)可能返回 NAN 作为日期值。表单校验触发时,这个 NAN 值被传递给校验规则。

  2. 规则冲突:你的校验规则中使用了 minLength: 10,这是用于字符串长度的校验,但 uni-datetime-picker 的值可能是时间戳(数字)或 Date 对象。当值为 NAN(Not a Number)时,minLength 校验可能产生非预期行为。

解决方案:

方案一:初始化默认值(推荐) 在 data 中为 form.happenedTime 设置一个合理的初始值,避免 undefined:

data() {
  return {
    form: {
      happenedTime: '' // 或 null,但避免 undefined
    }
  }
}

方案二:调整校验规则 移除 minLength 规则,改用自定义校验函数处理日期格式:

rules: {
  happenedTime: {
    rules: [{
      required: true,
      errorMessage: '请选择事发时间',
      trigger: 'change'
    }, {
      validateFunction: (rule, value, data, callback) => {
        if (value === null || value === undefined || isNaN(new Date(value).getTime())) {
          callback('请选择有效的事发时间')
        }
        return true
      }
    }]
  }
}

方案三:使用 value 属性替代 v-model 如果上述方法无效,可以尝试使用 value 属性和 change 事件:

<uni-datetime-picker 
  type="datetime" 
  :border="false" 
  :value="form.happenedTime"
  @change="onTimeChange"
  style="text-align: right;"
></uni-datetime-picker>
methods: {
  onTimeChange(e) {
    this.form.happenedTime = e
  }
}
回到顶部