diff --git a/app/src/main/java/com/navinfo/omqs/util/TimePeriod.kt b/app/src/main/java/com/navinfo/omqs/util/TimePeriod.kt index c621b1ec..afb3ee8c 100644 --- a/app/src/main/java/com/navinfo/omqs/util/TimePeriod.kt +++ b/app/src/main/java/com/navinfo/omqs/util/TimePeriod.kt @@ -1,6 +1,214 @@ package com.navinfo.omqs.util -data class TimePeriod( - val child: TimePeriod? = null +private data class TimePeriod( + //年 + var year: String = "", + //月 + var month: String = "", + //日 + var day: String = "", + //时 + var hour: String = "", + //分 + var minutes: String = "", + //周 + var week: String = "", +) -) \ No newline at end of file + +private data class TimePeriodObject( + //开始时间 + var startTime: TimePeriod? = null, + //结束时间 + var endTime: TimePeriod? = null, + //大括号,全部 + var allTime: TimePeriod? = null, +) { + /** + * 交集 * + */ + fun intersection(periodObject: TimePeriodObject) { + startTime?.let { one -> + periodObject.startTime?.let { two -> + if (one.year == "") { + one.year = two.year + } + if (one.month == "") { + one.month = two.month + } + if (one.day == "") { + one.day = two.day + } + if (one.hour == "") { + one.hour = two.hour + } + if (one.minutes == "") { + one.minutes = two.minutes + } + if (one.week == "") { + one.week = two.week + } + } + } + } + + /** + * 合集 + + */ + fun compilation(periodObject: TimePeriodObject) { + + } + + /** + * + */ + fun toText(): String { + if(endTime == null && allTime == null){ + + } + return "" + } +} + +private enum class TimeType { + NONE, + YEAR, + MONTH, + DAY, + HOUR, + MINUTES, + WEEK, +} + +class TimePeriodUtil { + + companion object { + private fun getTimePeriod(time: String): String { + val list = mutableListOf() + getPeriodObject(time.toCharArray(), 0, list) + return list[0].toText() + } + + private fun getPeriodObject( + charArray: CharArray, + index: Int, + parentList: MutableList + ): Int { + var i = index + while (i < charArray.size) { + when (charArray[i]) { + '[' -> { + i = getPeriodObject(charArray, i, parentList) + } + '(' -> { + var parentPeriodObject = TimePeriodObject() + i = getMixUnit(charArray, i, parentPeriodObject) + parentList.add(parentPeriodObject) + } + '*' -> { + i = getPeriodObject(charArray, i + 1, parentList) + if (parentList.size > 1) { + val o = parentList[0] + parentList[0].intersection(parentList[1]) + parentList.removeAt(1) + } + } + '+' -> { + i = getPeriodObject(charArray, i + 1, parentList) + if (parentList.size > 1) { + val o = parentList[0] + parentList[0].compilation(parentList[1]) + parentList.removeAt(1) + } + } + } + i++ + } + return i + } + + /** + * 单元 + */ + private fun getMixUnit( + charArray: CharArray, + index: Int, + parentPeriodObject: TimePeriodObject + ): Int { + var i = index + while (i < charArray.size) { + when (charArray[i]) { + '(' -> { + val timePeriod = TimePeriod() + i = getNumString(charArray, i + 1, timePeriod) + if (parentPeriodObject.startTime == null) { + parentPeriodObject.startTime = timePeriod + } else { + parentPeriodObject.endTime = timePeriod + } + } + '{' -> { + val timePeriod = TimePeriod() + i = getNumString(charArray, i + 1, timePeriod) + parentPeriodObject.allTime = timePeriod + } + ']' -> { + return i + } + } + i++ + } + return i + } + + /** + * 解析数字 + */ + private fun getNumString( + charArray: CharArray, + index: Int, + parentPeriod: TimePeriod + ): Int { + var i = index + var timeType = TimeType.NONE + val resBuffer = StringBuffer() + while (i < charArray.size) { + val char = charArray[i] + //拼数字 + if (char.isDigit() && timeType != TimeType.NONE) { + resBuffer.append(char) + } else { + when (timeType) { + TimeType.YEAR -> parentPeriod.year = resBuffer.toString() + TimeType.MONTH -> parentPeriod.month = resBuffer.toString() + TimeType.DAY -> parentPeriod.day = resBuffer.toString() + TimeType.HOUR -> parentPeriod.hour = resBuffer.toString() + TimeType.MINUTES -> parentPeriod.minutes = resBuffer.toString() + TimeType.WEEK -> parentPeriod.week = resBuffer.toString() + else -> {} + } + timeType = when (char) { + 'y' -> TimeType.YEAR + 'M' -> TimeType.MONTH + 'd' -> TimeType.DAY + 'h' -> TimeType.HOUR + 'm' -> TimeType.MINUTES + 't' -> TimeType.WEEK + ')', '}' -> { + return i + } + else -> TimeType.NONE + } + resBuffer.setLength(0) + } + i++ + } + return i + } + + } +} + +fun main() { + +} \ No newline at end of file