# DatetimePicker 时间选择

### 介绍

用于选择时间，支持日期、时分等时间维度，通常与 [弹出层](#/popup) 组件配合使用

### 引入

在`index.config.js中引入组件

```json
"usingComponents": {
  "van-datetime-picker": "@vant/weapp/datetime-picker/index"
}
```

## 代码演示

### 选择完整时间

`value` 为时间戳

```html
 <van-datetime-picker
            type="datetime"
            title={'选择完整时间'}
            data-type={"datetime"}
            loading={this.state.loading}
            value={this.state.currentDate1}
            minDate={this.state.minDate}
            maxDate={this.state.maxDate}
            onInput={(e)=>this.onInput(e)}
            onConfirm={(e)=>this.onConfirm(e)}
            onCancel={()=>this.onCancel()}
 />
```

```javascript

import Toast from "../../vant/toast/toast";

  state= {
    minHour: 10,
    maxHour: 20,
    minDate: new Date().getTime(),
    maxDate: new Date(2019, 10, 1).getTime(),
    currentDate: new Date().getTime(),
  },

  onInput(event) {
    this.setState({
      currentDate: event.detail,
    });
  }

  onConfirm(value) {
    const { detail, currentTarget } = value;
    const result = this.getResult(detail, currentTarget.dataset.type);
    Toast('点击确定'+result);
  }

  onCancel() {
    Toast('点击取消');
  }

```

### 选择日期（年月日）

`value` 为时间戳，通过传入 `formatter` 函数对选项文字进行处理

```html
<van-datetime-picker
  type="date"
  value="{{ currentDate }}"
  minDate={this.state.minDate}
  maxDate={this.state.maxDate}
  onInput={(e)=>this.onInput(e)}
/>
```

```js

  state: {
    currentDate: new Date().getTime(),
    minDate: new Date().getTime(),
  };

  onInput(event) {
    this.seState({
      currentDate: event.detail,
    });
  }

```

### 选择日期（年月）

`value` 为时间戳

```html
<van-datetime-picker
   type="year-month"
   data-type="year-month"
   value={this.state.currentDate3}
   minDate={this.state.minDate}
   maxDate={this.state.maxDate}
   onInput={(e)=>this.onInput(e)}
/>
```

```js

  state= {
    currentDate: new Date().getTime(),
    minDate: new Date().getTime(),
  };

  onInput(event) {
    this.seState({
      currentDate: event.detail,
    });
  },

```

### 选择时间

`value` 为字符串

```html
<van-datetime-picker
    type="time"
    data-type="time"
    value={this.state.currentDate4}
    minHour={this.state.minHour}
    maxHour={this.state.maxHour}
    onInput={(e)=>this.onInput(e)}
/>
```

```js

  state= {
    currentDate: '12:00',
    minHour: 10,
    maxHour: 20,
  },

  onInput(event) {
    this.seState({
      currentDate: event.detail,
    });
  }

```

## API
### 注:属性应用在组件上需要统一使用驼峰式命名，如custom-class应变为
```html
<van-button type="primary" customClass='myClass' size="large">大号按钮</van-button>
```
### 注:事件应用在组件上需要统一使用驼峰式命名，如bind:click/bind:search/bind:before-enter应变为
```html
<van-button type="primary" onClick={()=>this.onClick()}>大号按钮</van-button>
<van-search type="primary" onSearch={()=>this.onSearch()}>大号按钮</van-search>
<van-transition type="primary" onBeforeEnter={()=>this.onBeforeEnter()}>大号按钮</van-transition>
```
### Props

| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
| value | 当前选中值 | _string \| number_ | - | - |
| type | 类型，可选值为 `date` `time` `year-month` <br> <strong>不建议动态修改</strong> | _string_ | `datetime` | - |
| min-date | 可选的最小时间，精确到分钟 | _number_ | 十年前 | - |
| max-date | 可选的最大时间，精确到分钟 | _number_ | 十年后 | - |
| min-hour | 可选的最小小时，针对 time 类型 | _number_ | `0` | - |
| max-hour | 可选的最大小时，针对 time 类型 | _number_ | `23` | - |
| min-minute | 可选的最小分钟，针对 time 类型 | _number_ | `0` | - |
| max-minute | 可选的最大分钟，针对 time 类型 | _number_ | `59` | - |
| filter | 选项过滤函数 | _(type, values) => values_ | - | - |
| formatter | 选项格式化函数 | _(type, value) => value_ | - | - |
| title | 顶部栏标题 | _string_ | `''` | - |
| show-toolbar | 是否显示顶部栏 | _boolean_ | `true` | - |
| loading | 是否显示加载状态 | _boolean_ | `false` | - |
| item-height | 选项高度 | _number_ | `44` | - |
| confirm-button-text | 确认按钮文字 | _string_ | `确认` | - |
| cancel-button-text | 取消按钮文字 | _string_ | `取消` | - |
| visible-item-count | 可见的选项个数 | _number_ | `6` | - |

### Events

| 事件名称 | 说明                     | 回调参数   |
| -------- | ------------------------ | ---------- |
| input    | 当值变化时触发的事件     | 当前 value |
| change   | 当值变化时触发的事件     | 组件实例   |
| confirm  | 点击完成按钮时触发的事件 | 当前 value |
| cancel   | 点击取消按钮时触发的事件 | -          |

### change 事件

在`change`事件中，可以获取到组件实例，对组件进行相应的更新等操作：

| 函数                           | 说明                                       |
| ------------------------------ | ------------------------------------------ |
| getColumnValue(index)          | 获取对应列中选中的值                       |
| setColumnValue(index, value)   | 设置对应列中选中的值                       |
| getColumnValues(index)         | 获取对应列中所有的备选值                   |
| setColumnValues(index, values) | 设置对应列中所有的备选值                   |
| getValues()                    | 获取所有列中被选中的值，返回一个数组       |
| setValues(values)              | `values`为一个数组，设置所有列中被选中的值 |

### 外部样式类

| 类名          | 说明         |
| ------------- | ------------ |
| active-class  | 选中项样式类 |
| toolbar-class | 顶部栏样式类 |
| column-class  | 列样式类     |
