Skip to content

Instantly share code, notes, and snippets.

@Colerar
Created August 6, 2022 11:15
Show Gist options
  • Save Colerar/182f545a14378a577cd0feb8cbe88920 to your computer and use it in GitHub Desktop.
Save Colerar/182f545a14378a577cd0feb8cbe88920 to your computer and use it in GitHub Desktop.
import kotlinx.datetime.DayOfWeek
import java.time.DayOfWeek.*
private val enFull = Regex("""^(mon|tues?|wed(nes)?|thurs?|fri|sat(ur)?|sun)(day|\.)?$""", RegexOption.IGNORE_CASE)
fun parseDayOfWeek(expr: String): DayOfWeek? {
if (expr.isBlank()) return null
val trim = expr.trim()
trim.toIntOrNull()?.toDayOfWeek()?.let { return it }
matchEn(trim)?.let { return it }
matchZh(trim)?.let { return it }
return null
}
private fun matchZh(expr: String): DayOfWeek? {
if (expr.length == 1) {
return expr.first().zhCharToWeek()
}
if (expr.length == 2 && expr.startsWith("周")) {
expr[1].toString().toIntOrNull()?.toDayOfWeek()?.let { return it }
expr[1].zhCharToWeek()?.let { return it }
}
if (expr.length == 3 && expr.startsWith("星期")) {
expr[2].toString().toIntOrNull()?.toDayOfWeek()?.let { return it }
expr[2].zhCharToWeek()?.let { return it }
}
return null
}
private fun matchEn(expr: String): DayOfWeek? {
val full = enFull.find(expr) ?: return null
val g1 = full.groups[1]?.value?.lowercase() ?: return null
return when {
g1 == "mon" -> DayOfWeek.MONDAY
g1.startsWith("tue") -> DayOfWeek.TUESDAY
g1.startsWith("wed") -> DayOfWeek.WEDNESDAY
g1.startsWith("thur") -> DayOfWeek.THURSDAY
g1 == "fri" -> DayOfWeek.FRIDAY
g1.startsWith("sat") -> DayOfWeek.SATURDAY
g1 == "sun" -> DayOfWeek.SUNDAY
else -> null
}
}
private fun Int.toDayOfWeek(): DayOfWeek? = when (this) {
1 -> MONDAY
2 -> TUESDAY
3 -> WEDNESDAY
4 -> THURSDAY
5 -> FRIDAY
6 -> SATURDAY
7 -> SUNDAY
else -> null
}
private fun Char.zhCharToWeek(): DayOfWeek? = when (this) {
'一' -> MONDAY
'二' -> TUESDAY
'三' -> WEDNESDAY
'四' -> THURSDAY
'五' -> FRIDAY
'六' -> SATURDAY
'日' -> SUNDAY
'七' -> SUNDAY
else -> null
}
import io.kotest.matchers.shouldBe
import org.junit.jupiter.api.Test
import java.time.DayOfWeek.*
class DayOfWeekParserTest {
@Test
fun `parse number day of week`() {
parseDayOfWeek("1") shouldBe MONDAY
parseDayOfWeek("2") shouldBe TUESDAY
parseDayOfWeek("3") shouldBe WEDNESDAY
parseDayOfWeek("4") shouldBe THURSDAY
parseDayOfWeek("5") shouldBe FRIDAY
parseDayOfWeek("6") shouldBe SATURDAY
parseDayOfWeek("7") shouldBe SUNDAY
parseDayOfWeek("8") shouldBe null
}
@Test
fun `parse English full week`() {
parseDayOfWeek("MONDAY") shouldBe MONDAY
parseDayOfWeek("TUESDAY") shouldBe TUESDAY
parseDayOfWeek("WEDNESDAY") shouldBe WEDNESDAY
parseDayOfWeek("THURSDAY") shouldBe THURSDAY
parseDayOfWeek("FRIDAY") shouldBe FRIDAY
parseDayOfWeek("SATURDAY") shouldBe SATURDAY
parseDayOfWeek("SUNDAY") shouldBe SUNDAY
parseDayOfWeek("Staurn") shouldBe null
parseDayOfWeek("Monday") shouldBe MONDAY
parseDayOfWeek("Tuesday") shouldBe TUESDAY
parseDayOfWeek("Wednesday") shouldBe WEDNESDAY
parseDayOfWeek("Thursday") shouldBe THURSDAY
parseDayOfWeek("Friday") shouldBe FRIDAY
parseDayOfWeek("Saturday") shouldBe SATURDAY
parseDayOfWeek("Sunday") shouldBe SUNDAY
parseDayOfWeek("Fritm") shouldBe null
parseDayOfWeek("monday") shouldBe MONDAY
parseDayOfWeek("tuesday") shouldBe TUESDAY
parseDayOfWeek("wednesday") shouldBe WEDNESDAY
parseDayOfWeek("thursday") shouldBe THURSDAY
parseDayOfWeek("friday") shouldBe FRIDAY
parseDayOfWeek("saturday") shouldBe SATURDAY
parseDayOfWeek("sunday") shouldBe SUNDAY
parseDayOfWeek("fritm") shouldBe null
}
@Test
fun `parse English abbr week`() {
parseDayOfWeek("MON") shouldBe MONDAY
parseDayOfWeek("TUES") shouldBe TUESDAY
parseDayOfWeek("WEDNES") shouldBe WEDNESDAY
parseDayOfWeek("WED") shouldBe WEDNESDAY
parseDayOfWeek("THURS") shouldBe THURSDAY
parseDayOfWeek("THUR") shouldBe THURSDAY
parseDayOfWeek("FRI") shouldBe FRIDAY
parseDayOfWeek("SATUR") shouldBe SATURDAY
parseDayOfWeek("SAT") shouldBe SATURDAY
parseDayOfWeek("SUN") shouldBe SUNDAY
parseDayOfWeek("FRl") shouldBe null
parseDayOfWeek("Mon.") shouldBe MONDAY
parseDayOfWeek("Tues.") shouldBe TUESDAY
parseDayOfWeek("Wednes.") shouldBe WEDNESDAY
parseDayOfWeek("Wed.") shouldBe WEDNESDAY
parseDayOfWeek("Thurs.") shouldBe THURSDAY
parseDayOfWeek("Thur.") shouldBe THURSDAY
parseDayOfWeek("Fri.") shouldBe FRIDAY
parseDayOfWeek("Satur.") shouldBe SATURDAY
parseDayOfWeek("Sat.") shouldBe SATURDAY
parseDayOfWeek("Sun.") shouldBe SUNDAY
parseDayOfWeek("Saturn.") shouldBe null
parseDayOfWeek("mon.") shouldBe MONDAY
parseDayOfWeek("tues.") shouldBe TUESDAY
parseDayOfWeek("tue.") shouldBe TUESDAY
parseDayOfWeek("wednes.") shouldBe WEDNESDAY
parseDayOfWeek("wed.") shouldBe WEDNESDAY
parseDayOfWeek("thurs.") shouldBe THURSDAY
parseDayOfWeek("thur.") shouldBe THURSDAY
parseDayOfWeek("fri.") shouldBe FRIDAY
parseDayOfWeek("sat.") shouldBe SATURDAY
parseDayOfWeek("sun.") shouldBe SUNDAY
parseDayOfWeek("7hur.") shouldBe null
}
@Test
fun `zh char test`() {
parseDayOfWeek("一") shouldBe MONDAY
parseDayOfWeek("二") shouldBe TUESDAY
parseDayOfWeek("三") shouldBe WEDNESDAY
parseDayOfWeek("四") shouldBe THURSDAY
parseDayOfWeek("五") shouldBe FRIDAY
parseDayOfWeek("六") shouldBe SATURDAY
parseDayOfWeek("七") shouldBe SUNDAY
parseDayOfWeek("日") shouldBe SUNDAY
parseDayOfWeek("八") shouldBe null
}
@Test
fun `zh word test`() {
parseDayOfWeek("周一") shouldBe MONDAY
parseDayOfWeek("周二") shouldBe TUESDAY
parseDayOfWeek("周三") shouldBe WEDNESDAY
parseDayOfWeek("周四") shouldBe THURSDAY
parseDayOfWeek("周五") shouldBe FRIDAY
parseDayOfWeek("周六") shouldBe SATURDAY
parseDayOfWeek("周七") shouldBe SUNDAY
parseDayOfWeek("周日") shouldBe SUNDAY
parseDayOfWeek("周八") shouldBe null
parseDayOfWeek("星期一") shouldBe MONDAY
parseDayOfWeek("星期二") shouldBe TUESDAY
parseDayOfWeek("星期三") shouldBe WEDNESDAY
parseDayOfWeek("星期四") shouldBe THURSDAY
parseDayOfWeek("星期五") shouldBe FRIDAY
parseDayOfWeek("星期六") shouldBe SATURDAY
parseDayOfWeek("星期七") shouldBe SUNDAY
parseDayOfWeek("星期日") shouldBe SUNDAY
parseDayOfWeek("星期八") shouldBe null
parseDayOfWeek("星期1") shouldBe MONDAY
parseDayOfWeek("星期2") shouldBe TUESDAY
parseDayOfWeek("星期3") shouldBe WEDNESDAY
parseDayOfWeek("星期4") shouldBe THURSDAY
parseDayOfWeek("星期5") shouldBe FRIDAY
parseDayOfWeek("星期6") shouldBe SATURDAY
parseDayOfWeek("星期7") shouldBe SUNDAY
parseDayOfWeek("星期8") shouldBe null
parseDayOfWeek("周1") shouldBe MONDAY
parseDayOfWeek("周2") shouldBe TUESDAY
parseDayOfWeek("周3") shouldBe WEDNESDAY
parseDayOfWeek("周4") shouldBe THURSDAY
parseDayOfWeek("周5") shouldBe FRIDAY
parseDayOfWeek("周6") shouldBe SATURDAY
parseDayOfWeek("周7") shouldBe SUNDAY
parseDayOfWeek("周8") shouldBe null
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment