/* eslint-disable max-lines-per-function */ import React, { useState, useMemo } from 'react'; import { DatePicker, ConfigProvider, Select } from '@douyinfe/semi-ui'; import * as _ from 'lodash'; import * as dateFns from 'date-fns'; import { utcToZonedTime } from 'date-fns-tz'; const { Option } = Select; function Demo() { const now = new Date(); const startDate = dateFns.addMinutes(dateFns.subDays(now, 1), 5); const [timeZone, setTimeZone] = useState('GMT+09:00'); const gmtList = useMemo(() => { const list = []; for (let hourOffset = -11; hourOffset <= 14; hourOffset++) { const prefix = hourOffset >= 0 ? '+' : '-'; const hOffset = Math.abs(parseInt(hourOffset, 10)); list.push(`GMT${prefix}${String(hOffset).padStart(2, '0')}:00`); } return list; }, []); return (
{ const date = new Date(str); if (str.length <= 4) { return date.getFullYear() < 2015; } return date.getMonth() + 1 < 10; }} onChange={date => console.log('date changed', date)} /> { const date = new Date(str); if (str.length <= 4) { return date.getFullYear() < 2015; } return date.getMonth() + 1 < 10; }} />
Disabled 17:00:00-18:00:00 today (dateFns.isToday(date) ? { disabledHours: () => [17, 18], disabledMinutes: hour => (19 === hour ? _.range(0, 10, 1) : []), disabledSeconds: (hour, minute) => (hour === 20 && minute === 20 ? _.range(0, 20, 1) : []), } : null) } />
Month Picker
// [2019, 2018].includes(dateFns.getYear(date)) || 2020 === dateFns.getYear(date) && [1, 2, 3].includes(dateFns.getMonth(date)) } />
{/* 开始时间不能早于当下时间+5min,结束时间要在7天内 */} { const deadDate = dateFns.addDays(now, 7); return dateFns.isAfter(cur, deadDate) || dateFns.isBefore(cur, startDate); }} disabledTime={(dates, panelType) => { if (dateFns.isToday(dates[0]) && panelType === 'left') { return { disabledHours: () => _.range(0, now.getHours(), 1), disabledMinutes: hour => (now.getHours() === hour ? _.range(0, now.getMinutes() + 5, 1) : []), }; } }} onChange={(...args) => console.log(...args)} />
{/* 动态禁止时间,禁止选中之前的Date */} Disabled date before rangeStart { const { rangeStart } = options; const startDate = dateFns.parseISO(rangeStart); return dateFns.isBefore(cur, startDate); }} style={{ width: 240 }} />

type=month时禁止2020年且11月之前的日期 v1.10.0 { if (cur.getFullYear() === 2020 && cur.getMonth() < 10) { return true; } return false; }} style={{ width: 240 }} />

type=month时禁止2008年-2020年 v1.10.0 { const currentYear = cur.getFullYear(); if (2008 <= currentYear && currentYear <= 2020) { return true; } return false; }} />

fix disabledDate callback timeZone bug
Select Time Zone:


{ const date = new Date(str); const isDisabled = date.valueOf() === 1626274800000; if (isDisabled) { console.log(str); } return isDisabled; }} placeholder="禁用每月10号" onChange={date => { console.log('selected', date); }} /> { const date = new Date(str); const localDate = utcToZonedTime(date, timeZone); const isDisabled = localDate.getDate() === 15; return isDisabled ? ({ disabledHours: () => [18] }) : null; }} defaultPickerValue={new Date('2021-07-15 17:00:00')} placeholder="禁用7月15号下午6点" onChange={date => { console.log('selected', date); }} />
); } export default Demo;