YRDatePicker.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. /**
  2. * Created by Arison on 2019/8/16.
  3. */
  4. import React, {Component} from 'react';
  5. import {
  6. StyleSheet,
  7. View,
  8. Text,
  9. TextInput,
  10. TouchableOpacity,
  11. Dimensions} from 'react-native';
  12. import Picker from 'react-native-picker';
  13. import Toast, {DURATION} from 'react-native-easy-toast'
  14. class YRDatePicker extends React.Component{
  15. // static propTypes = {
  16. // dateTimeCallback: PropTypes.func
  17. // };
  18. constructor(props, context) {
  19. super(props, context);
  20. }
  21. _createDateData() {
  22. let date = [];
  23. for(let i=1970;i<2020;i++){
  24. let month = [];
  25. for(let j = 1;j<13;j++){
  26. let day = [];
  27. if(j === 2){
  28. for(let k=1;k<29;k++){
  29. day.push(k+'日');
  30. }
  31. //Leap day for years that are divisible by 4, such as 2000, 2004
  32. if(i%4 === 0){
  33. day.push(29+'日');
  34. }
  35. }
  36. else if(j in {1:1, 3:1, 5:1, 7:1, 8:1, 10:1, 12:1}){
  37. for(let k=1;k<32;k++){
  38. day.push(k+'日');
  39. }
  40. }
  41. else{
  42. for(let k=1;k<31;k++){
  43. day.push(k+'日');
  44. }
  45. }
  46. let _month = {};
  47. _month[j+'月'] = day;
  48. month.push(_month);
  49. }
  50. let _date = {};
  51. _date[i+'年'] = month;
  52. date.push(_date);
  53. }
  54. return date;
  55. }
  56. _showTimePicker() {
  57. let years = [],
  58. months = [],
  59. days = [],
  60. hours = [],
  61. minutes = [];
  62. for(let i=1;i<51;i++){
  63. years.push(i+1980);
  64. }
  65. for(let i=1;i<13;i++){
  66. months.push(i);
  67. hours.push(i);
  68. }
  69. for(let i=1;i<32;i++){
  70. days.push(i);
  71. }
  72. for(let i=1;i<61;i++){
  73. minutes.push(i);
  74. }
  75. let pickerData = [years, months, days, ['上午', '下午'], hours, minutes];
  76. let date = new Date();
  77. let selectedValue = [
  78. date.getFullYear(),
  79. date.getMonth()+1,
  80. date.getDate(),
  81. date.getHours() > 11 ? '下午' : '上午',
  82. date.getHours() === 12 ? 12 : date.getHours()%12,
  83. date.getMinutes()
  84. ];
  85. Picker.init({
  86. pickerData,
  87. selectedValue,
  88. pickerBg:[255,255,255,1],
  89. pickerCancelBtnText:'取消',
  90. pickerConfirmBtnText:'确定',
  91. pickerTitleText: '时间选择',
  92. wheelFlex: [2, 1, 1, 2, 1, 1],
  93. onPickerConfirm: pickedValue => {
  94. console.log('area', pickedValue);
  95. let selectTime=pickedValue[0]+"年"+pickedValue[1]+"月"+pickedValue[2]+"日"+pickedValue[3]+" "+pickedValue[4]+"时"+pickedValue[5]+"分";
  96. this.refs.toast.show('pickedValue:'+selectTime,6000);
  97. dateTimeCallback(pickedValue);
  98. },
  99. onPickerCancel: pickedValue => {
  100. console.log('area', pickedValue);
  101. },
  102. onPickerSelect: pickedValue => {
  103. let targetValue = [...pickedValue];
  104. if(parseInt(targetValue[1]) === 2){
  105. if(targetValue[0]%4 === 0 && targetValue[2] > 29){
  106. targetValue[2] = 29;
  107. }
  108. else if(targetValue[0]%4 !== 0 && targetValue[2] > 28){
  109. targetValue[2] = 28;
  110. }
  111. }
  112. else if(targetValue[1] in {4:1, 6:1, 9:1, 11:1} && targetValue[2] > 30){
  113. targetValue[2] = 30;
  114. }
  115. // forbidden some value such as some 2.29, 4.31, 6.31...
  116. if(JSON.stringify(targetValue) !== JSON.stringify(pickedValue)){
  117. // android will return String all the time,but we put Number into picker at first
  118. // so we need to convert them to Number again
  119. targetValue.map((v, k) => {
  120. if(k !== 3){
  121. targetValue[k] = parseInt(v);
  122. }
  123. });
  124. Picker.select(targetValue);
  125. pickedValue = targetValue;
  126. }
  127. }
  128. });
  129. Picker.show();
  130. }
  131. _toggle() {
  132. Picker.toggle();
  133. }
  134. _isPickerShow(){
  135. Picker.isPickerShow(status => {
  136. alert(status);
  137. });
  138. }
  139. render() {
  140. const { dateTimeCallback } = this.props;
  141. this._showTimePicker.bind(this,dateTimeCallback);
  142. return (
  143. <View style={{height: Dimensions.get('window').height}}>
  144. {/* <TouchableOpacity style={{marginTop: 40, marginLeft: 20}} onPress={this._showDatePicker.bind(this)}>
  145. <Text>DatePicker</Text>
  146. </TouchableOpacity>*/}
  147. {/*<TouchableOpacity style={{marginTop: 10, marginLeft: 20}} onPress={this._showTimePicker.bind(this,dateTimeCallback)}>*/}
  148. {/*<Text>TimePicker</Text>*/}
  149. {/*</TouchableOpacity>*/}
  150. {/*<TouchableOpacity style={{marginTop: 10, marginLeft: 20}} onPress={this._toggle.bind(this)}>*/}
  151. {/*<Text>toggle</Text>*/}
  152. {/*</TouchableOpacity>*/}
  153. {/*<TouchableOpacity style={{marginTop: 10, marginLeft: 20}} onPress={this._isPickerShow.bind(this)}>*/}
  154. {/*<Text>isPickerShow</Text>*/}
  155. {/*</TouchableOpacity>*/}
  156. <Toast
  157. ref="toast"
  158. position='center'/>
  159. </View>
  160. );
  161. }
  162. }
  163. const styles = StyleSheet.create({
  164. textStyle:{
  165. fontSize:18,
  166. },
  167. container:{
  168. flex:1,
  169. justifyContent:'center',
  170. alignItems:'center'
  171. },
  172. content:{
  173. width:'100%',
  174. flexDirection:'row',
  175. justifyContent:'space-around'
  176. }
  177. })
  178. export default YRDatePicker;