index.jsx 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import React, { useState, useMemo } from 'react';
  2. import { DatePicker, ConfigProvider, Select } from '@douyinfe/semi-ui';
  3. import * as _ from 'lodash';
  4. import * as dateFns from 'date-fns';
  5. import { utcToZonedTime } from 'date-fns-tz';
  6. const { Option } = Select;
  7. function Demo() {
  8. const now = new Date();
  9. const startDate = dateFns.addMinutes(dateFns.subDays(now, 1), 5);
  10. const [timeZone, setTimeZone] = useState('GMT+09:00');
  11. const gmtList = useMemo(() => {
  12. const list = [];
  13. for (let hourOffset = -11; hourOffset <= 14; hourOffset++) {
  14. const prefix = hourOffset >= 0 ? '+' : '-';
  15. const hOffset = Math.abs(parseInt(hourOffset, 10));
  16. list.push(`GMT${prefix}${String(hOffset).padStart(2, '0')}:00`);
  17. }
  18. return list;
  19. }, []);
  20. return (
  21. <div style={{ width: 300 }}>
  22. <DatePicker
  23. type="dateTime"
  24. disabledTimePicker={true}
  25. disabledDate={str => {
  26. const date = new Date(str);
  27. if (str.length <= 4) {
  28. return date.getFullYear() < 2015;
  29. }
  30. return date.getMonth() + 1 < 10;
  31. }}
  32. onChange={date => console.log('date changed', date)}
  33. />
  34. <DatePicker
  35. type="dateTimeRange"
  36. defaultValue={['2020-02-01 11:22:33', '2020-02-22 12:32:38']}
  37. disabledTimePicker={true}
  38. disabledDate={str => {
  39. const date = new Date(str);
  40. if (str.length <= 4) {
  41. return date.getFullYear() < 2015;
  42. }
  43. return date.getMonth() + 1 < 10;
  44. }}
  45. />
  46. <br />
  47. <strong>Disabled 17:00:00-18:00:00 today</strong>
  48. <DatePicker
  49. type="dateTime"
  50. hideDisabledOptions={false}
  51. disabledTime={date =>
  52. (dateFns.isToday(date)
  53. ? {
  54. disabledHours: () => [17, 18],
  55. disabledMinutes: hour => (19 === hour ? _.range(0, 10, 1) : []),
  56. disabledSeconds: (hour, minute) =>
  57. (hour === 20 && minute === 20 ? _.range(0, 20, 1) : []),
  58. }
  59. : null)
  60. }
  61. />
  62. <div>
  63. <h5>Month Picker</h5>
  64. <DatePicker
  65. type="month"
  66. disabledDate={date =>
  67. // [2019, 2018].includes(dateFns.getYear(date)) ||
  68. 2020 === dateFns.getYear(date) && [1, 2, 3].includes(dateFns.getMonth(date))
  69. }
  70. />
  71. </div>
  72. {/* 开始时间不能早于当下时间+5min,结束时间要在7天内 */}
  73. <DatePicker
  74. type={'dateTimeRange'}
  75. disabledDate={cur => {
  76. const deadDate = dateFns.addDays(now, 7);
  77. return dateFns.isAfter(cur, deadDate) || dateFns.isBefore(cur, startDate);
  78. }}
  79. disabledTime={(dates, panelType) => {
  80. if (dateFns.isToday(dates[0]) && panelType === 'left') {
  81. return {
  82. disabledHours: () => _.range(0, now.getHours(), 1),
  83. disabledMinutes: hour =>
  84. (now.getHours() === hour ? _.range(0, now.getMinutes() + 5, 1) : []),
  85. };
  86. }
  87. }}
  88. onChange={(...args) => console.log(...args)}
  89. />
  90. <br />
  91. {/* 动态禁止时间,禁止选中之前的Date */}
  92. <strong>Disabled date before rangeStart</strong>
  93. <DatePicker
  94. type={'dateRange'}
  95. disabledDate={(cur, options) => {
  96. const { rangeStart } = options;
  97. const startDate = dateFns.parseISO(rangeStart);
  98. return dateFns.isBefore(cur, startDate);
  99. }}
  100. style={{ width: 240 }}
  101. />
  102. <br /><br />
  103. <strong>type=month时禁止2020年且11月之前的日期 v1.10.0</strong>
  104. <DatePicker
  105. type={'month'}
  106. disabledDate={cur => {
  107. if (cur.getFullYear() === 2020 && cur.getMonth() < 10) {
  108. return true;
  109. }
  110. return false;
  111. }}
  112. style={{ width: 240 }}
  113. />
  114. <br /><br />
  115. <strong>type=month时禁止2008年-2020年 v1.10.0</strong>
  116. <DatePicker
  117. type={'month'}
  118. style={{ width: 240 }}
  119. disabledDate={cur => {
  120. const currentYear = cur.getFullYear();
  121. if (2008 <= currentYear && currentYear <= 2020) {
  122. return true;
  123. }
  124. return false;
  125. }}
  126. />
  127. <br /><br />
  128. <strong>fix disabledDate callback timeZone bug</strong>
  129. <ConfigProvider timeZone={timeZone}>
  130. <div style={{ width: 300 }}>
  131. <h5 style={{ margin: 10 }}>Select Time Zone:</h5>
  132. <Select
  133. placeholder={'请选择时区'}
  134. style={{ width: 300 }}
  135. value={timeZone}
  136. showClear={true}
  137. onSelect={value => setTimeZone(value)}
  138. >
  139. {gmtList.map(gmt => (
  140. <Option key={gmt} value={gmt}>
  141. {gmt}
  142. </Option>
  143. ))}
  144. </Select>
  145. <br />
  146. <br />
  147. <DatePicker
  148. disabledDate={str => {
  149. const date = new Date(str);
  150. const isDisabled = date.valueOf() === 1626274800000;
  151. if (isDisabled) {
  152. console.log(str);
  153. }
  154. return isDisabled;
  155. }}
  156. placeholder="禁用每月10号"
  157. onChange={date => {
  158. console.log('selected', date);
  159. }}
  160. />
  161. <DatePicker
  162. type="dateTime"
  163. disabledTime={str => {
  164. const date = new Date(str);
  165. const localDate = utcToZonedTime(date, timeZone);
  166. const isDisabled = localDate.getDate() === 15;
  167. return isDisabled ? ({ disabledHours: () => [18] }) : null;
  168. }}
  169. defaultPickerValue={new Date('2021-07-15 17:00:00')}
  170. placeholder="禁用7月15号下午6点"
  171. onChange={date => {
  172. console.log('selected', date);
  173. }}
  174. />
  175. </div>
  176. </ConfigProvider>
  177. </div>
  178. );
  179. }
  180. export default Demo;