index.jsx 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. import React, { useMemo, useState } from 'react';
  2. import { ConfigProvider, Select, DatePicker, TimePicker } from '@douyinfe/semi-ui';
  3. import { IANAOffsetMap, zonedTimeToUtc, utcToZonedTime, format as tzFormat } from '@douyinfe/semi-foundation/utils/date-fns-extra';
  4. import { parse, format, addDays, addWeeks, startOfMonth, endOfMonth, addMonths } from 'date-fns';
  5. import zh_CN from '@douyinfe/semi-ui/locale/source/zh_CN';
  6. import en_GB from '@douyinfe/semi-ui/locale/source/en_GB';
  7. import ko_KR from '@douyinfe/semi-ui/locale/source/ko_KR';
  8. import ja_JP from '@douyinfe/semi-ui/locale/source/ja_JP';
  9. const { Option } = Select;
  10. const presets = [
  11. {
  12. text: 'Today',
  13. start: new Date(),
  14. end: new Date(),
  15. },
  16. {
  17. text: 'Tomorrow',
  18. start: addDays(new Date(), 1),
  19. end: addDays(new Date(), 1),
  20. },
  21. {
  22. text: 'Next Week',
  23. start: addWeeks(new Date(), 1),
  24. end: addWeeks(new Date(), 2),
  25. },
  26. {
  27. text: 'Next Month',
  28. start: startOfMonth(addMonths(new Date(), 1)),
  29. end: endOfMonth(addMonths(new Date(), 1)),
  30. },
  31. {
  32. text: 'Today',
  33. start: new Date(),
  34. end: new Date(),
  35. },
  36. {
  37. text: 'Tomorrow',
  38. start: addDays(new Date(), 1),
  39. end: addDays(new Date(), 1),
  40. },
  41. {
  42. text: 'Next Week',
  43. start: addWeeks(new Date(), 1),
  44. end: addWeeks(new Date(), 2),
  45. },
  46. {
  47. text: 'Next Month',
  48. start: startOfMonth(addMonths(new Date(), 1)),
  49. end: endOfMonth(addMonths(new Date(), 1)),
  50. },
  51. ];
  52. const Demo = () => {
  53. const [timeZone, setTimeZone] = useState('GMT-08:00');
  54. const [localeCode, setLocaleCode] = useState(zh_CN.code);
  55. const defaultTimestamp = 1581599305265;
  56. const defaultTimestampEnd = defaultTimestamp + 3600 * 24 * 2 + 1600 * 2;
  57. const formatToken = 'yyyy-MM-dd HH:mm:ss';
  58. const defaultDate = parse(`2020-02-13 21:08:25`, formatToken, Date.now());
  59. const gmtList = useMemo(
  60. () =>
  61. IANAOffsetMap.map(([hourOffset, [iana]]) => {
  62. const hOffset = Math.abs(parseInt(hourOffset, 10));
  63. const mOffset = Math.abs(Math.abs(hourOffset) - hOffset);
  64. const prefix = hourOffset >= 0 ? '+' : '-';
  65. return `GMT${prefix}${String(hOffset).padStart(2, '0')}:${String(mOffset * 60).padStart(2, '0')}`;
  66. }),
  67. []
  68. );
  69. const localeList = useMemo(() => [zh_CN, en_GB, ko_KR, ja_JP], []);
  70. const [timeDate, setTimeDate] = useState(new Date(defaultTimestamp));
  71. const [date, setDate] = useState(new Date(defaultTimestamp));
  72. const Item = useMemo(() => (props = {}) => <div {...props} style={{ marginBottom: 20, ...props.style }} />, []);
  73. return (
  74. <ConfigProvider timeZone={timeZone} locale={localeList.find(locale => locale.code === localeCode)}>
  75. <div style={{ width: 300 }}>
  76. <Item>
  77. <Select
  78. placeholder={'Select time zone'}
  79. style={{ width: 300 }}
  80. value={timeZone}
  81. onSelect={value => setTimeZone(value)}
  82. >
  83. {gmtList.map(gmt => (
  84. <Option key={gmt} value={gmt}>
  85. {gmt}
  86. </Option>
  87. ))}
  88. </Select>
  89. <Select placeholder={'Select locale'} value={localeCode} onSelect={value => setLocaleCode(value)}>
  90. {localeList.map(locale => (
  91. <Option key={locale.code} value={locale.code}>
  92. {locale.code}
  93. </Option>
  94. ))}
  95. </Select>
  96. </Item>
  97. <Item>
  98. <strong>Same UTC Time</strong>
  99. <ul>
  100. {gmtList.map(gmt => (
  101. <li key={gmt}>
  102. <strong style={{ marginRight: 5 }}>{gmt}</strong>
  103. <span>{tzFormat(defaultTimestamp, formatToken, { timeZone: gmt })}</span>
  104. </li>
  105. ))}
  106. </ul>
  107. <strong>Same Time String</strong>
  108. <ul>
  109. {gmtList.map(gmt => (
  110. <li key={gmt}>
  111. <strong style={{ marginRight: 5 }}>{gmt}</strong>
  112. <span>
  113. {tzFormat(zonedTimeToUtc(format(defaultTimestamp, formatToken), gmt), formatToken)}
  114. </span>
  115. </li>
  116. ))}
  117. </ul>
  118. </Item>
  119. <Item>
  120. <h2>Uncontrolled DatePicker</h2>
  121. <DatePicker
  122. type={'dateTime'}
  123. defaultValue={new Date(defaultTimestamp)}
  124. format={formatToken}
  125. onChange={(date, dateString) => console.log('DatePicker changed: ', date, dateString)}
  126. />
  127. </Item>
  128. <Item>
  129. <h2>Controlled DatePicker</h2>
  130. <DatePicker
  131. type={'dateTime'}
  132. value={date}
  133. format={formatToken}
  134. onChange={(date, dateString) => {
  135. console.log('DatePicker changed: ', date, dateString);
  136. setDate(date);
  137. }}
  138. />
  139. </Item>
  140. <Item>
  141. <h2>With Confirm and Persets</h2>
  142. <DatePicker
  143. type="dateTime"
  144. needConfirm
  145. presets={presets.map(preset => ({
  146. text: preset.text,
  147. start: preset.start,
  148. }))}
  149. onChange={(...args) => console.log(...args)}
  150. />
  151. </Item>
  152. <Item>
  153. <h2>Uncontrolled TimePicker</h2>
  154. <TimePicker
  155. defaultValue={new Date(defaultTimestamp)}
  156. onChange={(time, timeString) => console.log('TimePicker changed: ', time, timeString)}
  157. />
  158. </Item>
  159. <Item>
  160. <h2>Controlled TimePicker</h2>
  161. <TimePicker
  162. value={timeDate}
  163. onChange={(time, timeString) => {
  164. console.log('TimePicker changed: ', time, timeString);
  165. // setTimeDate(time);
  166. setTimeDate(timeString);
  167. }}
  168. />
  169. </Item>
  170. </div>
  171. </ConfigProvider>
  172. );
  173. };
  174. export default Demo;