Skip to content

Commit e61c15b

Browse files
author
jaaksi
committed
解决夏令时getDayOffset有误差bug
1 parent 1d8deba commit e61c15b

File tree

3 files changed

+46
-21
lines changed

3 files changed

+46
-21
lines changed

app/src/main/java/org/jaaksi/pickerview/demo/ui/MixedTimeFormatFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class MixedTimeFormatFragment : BaseFragment<FragmentMixedtimeFormatBinding>(),
5252
): CharSequence {
5353
if (type == TimePicker.TYPE_MIXED_DATE) {
5454
val text: CharSequence
55-
val dayOffset = DateUtil.getDayOffset(value, System.currentTimeMillis())
55+
val dayOffset = DateUtil.getIntervalDay(System.currentTimeMillis(),value)
5656
text = when (dayOffset) {
5757
0 -> "今天"
5858

pickerview/src/main/java/org/jaaksi/pickerview/picker/TimePicker.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import android.content.Context
44
import org.jaaksi.pickerview.adapter.ArrayWheelAdapter
55
import org.jaaksi.pickerview.adapter.NumericWheelAdapter
66
import org.jaaksi.pickerview.dialog.IPickerDialog
7+
import org.jaaksi.pickerview.util.DateUtil
78
import org.jaaksi.pickerview.util.DateUtil.createDateFormat
89
import org.jaaksi.pickerview.util.DateUtil.getDayOfMonth
9-
import org.jaaksi.pickerview.util.DateUtil.getDayOffset
1010
import org.jaaksi.pickerview.widget.BasePickerView
1111
import org.jaaksi.pickerview.widget.BasePickerView.OnSelectedListener
1212
import org.jaaksi.pickerview.widget.PickerView
@@ -492,9 +492,9 @@ class TimePicker private constructor(
492492
private fun isSameDay(isStart: Boolean): Boolean {
493493
return if (hasType(TYPE_MIXED_DATE)) {
494494
if (isStart) {
495-
getDayOffset(selectedDate.time, mStartDate.timeInMillis) == 0
495+
DateUtil.isSameDay(mStartDate.timeInMillis,selectedDate.time)
496496
} else {
497-
getDayOffset(selectedDate.time, mEndDate.timeInMillis) == 0
497+
DateUtil.isSameDay(mEndDate.timeInMillis, selectedDate.time)
498498
}
499499
} else {
500500
val year =
@@ -516,8 +516,8 @@ class TimePicker private constructor(
516516
val isSameStartDay: Boolean
517517
val isSameEndDay: Boolean
518518
if (hasType(TYPE_MIXED_DATE)) {
519-
isSameStartDay = getDayOffset(selectedDate.time, mStartDate.timeInMillis) == 0
520-
isSameEndDay = getDayOffset(selectedDate.time, mEndDate.timeInMillis) == 0
519+
isSameStartDay = DateUtil.isSameDay(selectedDate.time, mStartDate.timeInMillis)
520+
isSameEndDay = DateUtil.isSameDay(selectedDate.time, mEndDate.timeInMillis)
521521
} else {
522522
val year =
523523
if (hasType(TYPE_YEAR)) mYearPicker!!.selectedItem!! else mSelectedDate!![Calendar.YEAR]
@@ -622,7 +622,7 @@ class TimePicker private constructor(
622622
* 获取指定日期距离第0个的offset
623623
*/
624624
private fun offsetStart(calendar: Calendar): Int {
625-
return getDayOffset(calendar.timeInMillis, mStartDate.timeInMillis)
625+
return DateUtil.getIntervalDay(mStartDate.timeInMillis, calendar.timeInMillis)
626626
}
627627

628628
private val selectedDate: Date

pickerview/src/main/java/org/jaaksi/pickerview/util/DateUtil.kt

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ package org.jaaksi.pickerview.util
33
import java.text.SimpleDateFormat
44
import java.util.Calendar
55
import java.util.Locale
6+
import kotlin.math.max
7+
import kotlin.math.min
68

79
/**
810
* 创建时间:2018年02月02日12:00 <br></br>
911
* 作者:fuchaoyang <br></br>
1012
* 描述:时间工具类
1113
*/
1214
object DateUtil {
13-
const val ONE_DAY = 1000 * 60 * 60 * 24L
1415

1516
@JvmStatic
1617
fun createDateFormat(format: String): SimpleDateFormat {
@@ -27,22 +28,46 @@ object DateUtil {
2728
return c[Calendar.DAY_OF_MONTH]
2829
}
2930

31+
// 判断两个时间戳是否是同一天
32+
fun isSameDay(time1: Long, time2: Long): Boolean{
33+
return time1.dayStart() == time2.dayStart()
34+
}
35+
3036
/**
31-
* 获取两个时间相差的天数
32-
*
33-
* @param time1 time1
34-
* @param time2 time2
35-
* @return time1 - time2相差的天数
37+
* 不能用时间戳差值 / 86400000, 夏令时会有误差
38+
* @return endTime - startTime 相差的天数
3639
*/
37-
@JvmStatic
38-
fun getDayOffset(time1: Long, time2: Long): Int {
39-
// 将小的时间置为当天的0点
40-
val offsetTime: Long = if (time1 > time2) {
41-
time1 - time2.dayStart()
42-
} else {
43-
time1.dayStart() - time2
40+
fun getIntervalDay(time1: Long, time2: Long): Int {
41+
val cal1 = Calendar.getInstance().apply { timeInMillis = min(time1,time2) }
42+
val cal2 = Calendar.getInstance().apply { timeInMillis = max(time1, time2) }
43+
44+
// 如果是同一年,直接计算 dayOfYear 差值
45+
if (cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR)) {
46+
return if (time1 > time2)
47+
-(cal2.get(Calendar.DAY_OF_YEAR) - cal1.get(Calendar.DAY_OF_YEAR))
48+
else
49+
cal2.get(Calendar.DAY_OF_YEAR) - cal1.get(Calendar.DAY_OF_YEAR)
50+
}
51+
52+
// 跨年计算
53+
var daysBetween = 0
54+
55+
// 1. 计算起始年剩余的天数
56+
val daysLeftInYear1 = cal1.getActualMaximum(Calendar.DAY_OF_YEAR) - cal1.get(Calendar.DAY_OF_YEAR)
57+
daysBetween += daysLeftInYear1
58+
59+
// 2. 计算中间完整年份的天数
60+
var year = cal1.get(Calendar.YEAR) + 1
61+
while (year < cal2.get(Calendar.YEAR)) {
62+
val tempCal = Calendar.getInstance().apply { set(Calendar.YEAR, year) }
63+
daysBetween += tempCal.getActualMaximum(Calendar.DAY_OF_YEAR)
64+
year++
4465
}
45-
return (offsetTime / ONE_DAY).toInt()
66+
67+
// 3. 计算结束年已过的天数
68+
daysBetween += cal2.get(Calendar.DAY_OF_YEAR)
69+
70+
return if (time1 > time2) -daysBetween else daysBetween
4671
}
4772

4873
fun Long.toCalendar(): Calendar {

0 commit comments

Comments
 (0)