From 8196da4bfae9d24d5a6a5d5b9729421571e2e149 Mon Sep 17 00:00:00 2001 From: Henning Hall Date: Tue, 6 Nov 2018 22:33:17 +0100 Subject: [PATCH] Changed date format from unix to iso. --- DatePickerAndroid.js | 52 +++++++++++-------- .../date_picker/DatePickerManager.java | 16 +++--- .../henninghall/date_picker/PickerView.java | 2 +- .../com/henninghall/date_picker/Utils.java | 23 +++++++- package.json | 5 +- 5 files changed, 64 insertions(+), 34 deletions(-) diff --git a/DatePickerAndroid.js b/DatePickerAndroid.js index 8d31322..3e45fc1 100644 --- a/DatePickerAndroid.js +++ b/DatePickerAndroid.js @@ -1,5 +1,6 @@ import React from 'react'; import { DatePickerIOS, requireNativeComponent, StyleSheet } from 'react-native'; +import moment from 'moment' const NativeDatePicker = requireNativeComponent(`DatePickerManager`, DatePickerAndroid, { nativeOnly: { onChange: true } }); @@ -10,30 +11,37 @@ class DatePickerAndroid extends React.Component { minuteInterval: 1, }; - render = () => ( - - ) - - _onChange = e => this.props.onDateChange(new Date(parseInt(e.nativeEvent.date + this._getOffsetMillis()))); - _maximumDate = () => this._toUnixMillisWithTimeZoneOffset(this.props.maximumDate); - _minimumDate = () => this._toUnixMillisWithTimeZoneOffset(this.props.minimumDate); - _date = () => this._toUnixMillisWithTimeZoneOffset(this.props.date); - _toUnixMillisWithTimeZoneOffset = date => date && this._toUnixMillis(date) - this._getOffsetMillis(); - _toUnixMillis = date => date.getTime() - - _getOffsetMillis = () => this.props.timeZoneOffsetInMinutes === undefined ? 0 - : -toMs(this.props.timeZoneOffsetInMinutes + new Date().getTimezoneOffset()) + render = () => { + return ( + + ) + } -} + _onChange = e => { + const momentDateWithOffset = moment(e.nativeEvent.date).add(this._getOffsetMinutes(), 'minutes') + const jsDate = momentDateWithOffset.toDate() + this.props.onDateChange(jsDate) + } -const toMs = minutes => minutes * 60 * 1000 + _maximumDate = () => this._toIsoWithTimeZoneOffset(this.props.maximumDate); + + _minimumDate = () => this._toIsoWithTimeZoneOffset(this.props.minimumDate); + + _date = () => this._toIsoWithTimeZoneOffset(this.props.date); + + _toIsoWithTimeZoneOffset = date => date && moment(date).add( -this._getOffsetMinutes(), 'minutes').toISOString() + + _getOffsetMinutes = () => this.props.timeZoneOffsetInMinutes === undefined ? 0 + : -(this.props.timeZoneOffsetInMinutes + new Date().getTimezoneOffset()) + +} const styles = StyleSheet.create({ picker: { diff --git a/android/src/main/java/com/henninghall/date_picker/DatePickerManager.java b/android/src/main/java/com/henninghall/date_picker/DatePickerManager.java index a28d33e..1bba47b 100644 --- a/android/src/main/java/com/henninghall/date_picker/DatePickerManager.java +++ b/android/src/main/java/com/henninghall/date_picker/DatePickerManager.java @@ -16,7 +16,7 @@ public class DatePickerManager extends SimpleViewManager { public static final String REACT_CLASS = "DatePickerManager"; public static ThemedReactContext context; - private double date; + private String date; @Override public String getName() { @@ -42,7 +42,7 @@ public class DatePickerManager extends SimpleViewManager { } @ReactProp(name = "date") - public void setDate(PickerView view, @Nullable double date) { + public void setDate(PickerView view, @Nullable String date) { this.date = date; } @@ -52,13 +52,13 @@ public class DatePickerManager extends SimpleViewManager { } @ReactProp(name = "minimumDate") - public void setMinimumDate(PickerView view, @Nullable double date) { - view.setMinimumDate(Utils.unixToDate(date)); + public void setMinimumDate(PickerView view, @Nullable String date) { + view.setMinimumDate(Utils.isoToDate(date)); } @ReactProp(name = "maximumDate") - public void setMaximumDate(PickerView view, @Nullable double date) { - view.setMaximumDate(Utils.unixToDate(date)); + public void setMaximumDate(PickerView view, @Nullable String date) { + view.setMaximumDate(Utils.isoToDate(date)); } @ReactProp(name = "fadeToColor") @@ -80,8 +80,8 @@ public class DatePickerManager extends SimpleViewManager { @Override protected void onAfterUpdateTransaction(PickerView view) { super.onAfterUpdateTransaction(view); - view.updateDisplayValuesIfNeeded(); - view.setDate(Utils.unixToDate(date)); + view.updateDisplayValuesIfNeeded(); + view.setDate(Utils.isoToDate(date)); } public Map getExportedCustomBubblingEventTypeConstants() { diff --git a/android/src/main/java/com/henninghall/date_picker/PickerView.java b/android/src/main/java/com/henninghall/date_picker/PickerView.java index b004d82..5e89e22 100644 --- a/android/src/main/java/com/henninghall/date_picker/PickerView.java +++ b/android/src/main/java/com/henninghall/date_picker/PickerView.java @@ -89,7 +89,7 @@ public class PickerView extends RelativeLayout { if (minDate != null && date.before(minDate)) applyOnVisibleWheels(new AnimateToDate(minDate)); else if (maxDate != null && date.after(maxDate)) applyOnVisibleWheels(new AnimateToDate(maxDate)); else { - event.putDouble("date", date.getTime()); + event.putString("date", Utils.dateToIso(date)); DatePickerManager.context.getJSModule(RCTEventEmitter.class).receiveEvent(getId(), "dateChange", event); } } catch (ParseException e) { diff --git a/android/src/main/java/com/henninghall/date_picker/Utils.java b/android/src/main/java/com/henninghall/date_picker/Utils.java index 4db69d3..ed8fbc0 100644 --- a/android/src/main/java/com/henninghall/date_picker/Utils.java +++ b/android/src/main/java/com/henninghall/date_picker/Utils.java @@ -5,11 +5,14 @@ import android.text.format.DateUtils; import android.util.TypedValue; import android.view.View; +import java.sql.Time; import java.text.DateFormat; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; +import java.util.TimeZone; public class Utils { @@ -22,8 +25,17 @@ public class Utils { return UnitPatterns.of(locale).getTodayWord(); } - public static Date unixToDate(double date) { - return date > 0 ? new Date((long)date) : null; + public static Date isoToDate(String date) { + try { + return getIsoUTCFormat().parse(date); + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + + public static String dateToIso(Date date) { + return getIsoUTCFormat().format(date); } public static int getWheelHeight(View pickerView) { @@ -52,4 +64,11 @@ public class Utils { return null; } } + + private static SimpleDateFormat getIsoUTCFormat(){ + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US); + format.setTimeZone(TimeZone.getTimeZone("UTC")); + return format; + } + } diff --git a/package.json b/package.json index 942611b..c60310e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-date-picker", - "version": "2.1.1", + "version": "2.0.3", "description": "A Cross Platform React Native Picker", "main": "index.js", "scripts": { @@ -12,6 +12,9 @@ "type": "git", "url": "git@github.com:henninghall/react-native-date-picker.git" }, + "dependencies": { + "moment": "^2.22.1" + }, "author": "henninghall", "license": "MIT", "homepage": "https://github.com/henninghall/react-native-date-picker",