{"id":23954175,"url":"https://github.com/darkokoa/compose-datetime-wheel-picker","last_synced_at":"2026-01-24T14:18:35.829Z","repository":{"id":220679651,"uuid":"752275068","full_name":"darkokoa/compose-datetime-wheel-picker","owner":"darkokoa","description":"Wheel Date \u0026 Time Picker in Compose Multiplatform","archived":false,"fork":false,"pushed_at":"2026-01-22T11:28:38.000Z","size":480,"stargazers_count":215,"open_issues_count":14,"forks_count":18,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-23T00:58:09.727Z","etag":null,"topics":["android","compose","compose-multiplatform","compose-ui","datetime-picker","jetpack-compose","kotiln","kotlin-multiplatform"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/darkokoa.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-02-03T14:56:38.000Z","updated_at":"2026-01-22T20:41:38.000Z","dependencies_parsed_at":"2024-03-06T17:15:04.584Z","dependency_job_id":"79dd156d-31fc-4f92-90b4-13526633175b","html_url":"https://github.com/darkokoa/compose-datetime-wheel-picker","commit_stats":null,"previous_names":["darkokoa/chrono-wheel-picker","darkokoa/datetime-wheel-picker","darkokoa/compose-datetime-wheel-picker"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/darkokoa/compose-datetime-wheel-picker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkokoa%2Fcompose-datetime-wheel-picker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkokoa%2Fcompose-datetime-wheel-picker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkokoa%2Fcompose-datetime-wheel-picker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkokoa%2Fcompose-datetime-wheel-picker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/darkokoa","download_url":"https://codeload.github.com/darkokoa/compose-datetime-wheel-picker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkokoa%2Fcompose-datetime-wheel-picker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28729450,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-24T10:24:43.181Z","status":"ssl_error","status_checked_at":"2026-01-24T10:24:36.112Z","response_time":89,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","compose","compose-multiplatform","compose-ui","datetime-picker","jetpack-compose","kotiln","kotlin-multiplatform"],"created_at":"2025-01-06T15:00:33.320Z","updated_at":"2026-01-24T14:18:35.823Z","avatar_url":"https://github.com/darkokoa.png","language":"Kotlin","funding_links":[],"categories":["Kotlin","Multiplatform"],"sub_categories":["Android samples"],"readme":"# datetime-wheel-picker (work-in-progress 👷🔧️👷‍♀️⛏)\n\n![badge-android][badge-android]\n![badge-jvm][badge-jvm]\n![badge-ios][badge-ios]\n![badge-js][badge-js]\n![badge-wasm][badge-wasm]\n\n[Compose Multiplatform](https://www.jetbrains.com/compose-multiplatform/) datetime picker implementation featuring **highly customizable** wheel pickers for date, time, and datetime selection.\n\n| Picker                                                                                                                                     | Basic Usage                                                                                            |\n|--------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|\n| \u003cimg src=\"https://user-images.githubusercontent.com/50905347/201921058-82c7813d-b9c4-448c-a296-62465845152d.gif\" width=\"256\" height=\"256\"\u003e | ```WheelDateTimePicker { snappedDateTime -\u003e }```                                                       |\n| \u003cimg src=\"https://user-images.githubusercontent.com/50905347/201921069-14a8410b-5952-4130-80b0-71f9ca286a93.gif\" width=\"256\" height=\"256\"\u003e | ```WheelDatePicker { snappedDate -\u003e }```                                                               |\n| \u003cimg src=\"https://user-images.githubusercontent.com/50905347/201921066-b94b9fcd-c447-4b01-833f-03600e20ed44.gif\" width=\"256\" height=\"256\"\u003e | ```WheelTimePicker { snappedTime -\u003e }```                                                               |\n| \u003cimg src=\"https://user-images.githubusercontent.com/50905347/205661315-2eac971a-2dd9-41dc-93e7-de2be0514a9e.gif\" width=\"256\" height=\"256\"\u003e | ```WheelTimePicker(timeFormatter = timeFormatter(timeFormat = TimeFormat.AM_PM)) { snappedTime -\u003e }``` |\n\n## Key Features\n\n### 🎯 Flexible Date Field Configuration\n- **Customizable date order**: DMY (Day-Month-Year), MDY (Month-Day-Year), or YMD (Year-Month-Day)\n- **Hide year picker**: Set `yearsRange = null` to create **day-month only** or **month-day only** pickers\n- **Custom year range**: Limit year selection to specific ranges (e.g., next 10 years, last 50 years)\n- **Multiple month display styles**: Full names, short names, or numeric format\n\n### 🌍 Internationalization \u0026 Localization\n- **Auto-adapts to locale**: Date order and month names automatically match the current locale\n- **CJK language support**: Special handling for Chinese (年/月/日), Japanese (年/月/日), Korean (년/월/일) with customizable year/month/day suffixes\n- **Localized numerals**: Supports Eastern Arabic numerals and other numeral systems\n\n**Currently Supported Languages (22):**\nArabic (العربية), Bengali (বাংলা), Chinese (中文), Dutch (Nederlands), English, French (Français), German (Deutsch), Hebrew (עברית), Hindi (हिन्दी), Indonesian (Bahasa Indonesia), Italian (Italiano), Japanese (日本語), Korean (한국어), Persian (فارسی), Polish (Polski), Portuguese (Português), Russian (Русский), Spanish (Español), Thai (ไทย), Turkish (Türkçe), Ukrainian (Українська), Vietnamese (Tiếng Việt)\n\n\u003e **Contributions welcome**: If you find any translation errors or want to add support for a new language, please [open an issue](../../issues) or submit a pull request.\n\n### 🎨 Visual Customization\n- Configurable size, row count, text style, and colors\n- Customizable selector appearance (shape, color, border)\n- Material Design integration\n\n### ⏰ Time Picker Features\n- 12-hour (AM/PM) and 24-hour formats\n- Customizable time display\n\n## Common Use Cases\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eDay-Month Picker (No Year)\u003c/b\u003e\u003c/summary\u003e\n\nPerfect for birthdays, anniversaries, or recurring events:\n\n```kotlin\nWheelDatePicker(\n  startDate = LocalDate(2025, 6, 15),\n  yearsRange = null,  // Hides the year picker\n  dateFormatter = dateFormatter(\n    dateOrder = DateOrder.DMY,\n    monthDisplayStyle = MonthDisplayStyle.FULL\n  )\n) { snappedDate -\u003e\n  // snappedDate.month and snappedDate.dayOfMonth\n}\n```\n\n\u003e **Note**: This uses the non-Composable `dateFormatter()` overload that accepts `dateOrder` parameter.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eMonth-Day Picker (US Format)\u003c/b\u003e\u003c/summary\u003e\n\nFor US-style date input without year:\n\n```kotlin\nWheelDatePicker(\n  yearsRange = null,\n  dateFormatter = dateFormatter(\n    dateOrder = DateOrder.MDY,\n    monthDisplayStyle = MonthDisplayStyle.SHORT\n  )\n) { snappedDate -\u003e }\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eLimited Year Range\u003c/b\u003e\u003c/summary\u003e\n\nRestrict year selection to a specific range:\n\n```kotlin\n// Only allow next 10 years\nWheelDatePicker(\n  yearsRange = IntRange(2025, 2035),\n  dateFormatter = dateFormatter(\n    dateOrder = DateOrder.YMD\n  )\n) { snappedDate -\u003e }\n\n// Only allow past 50 years (for birthdate)\nval currentYear = Clock.System.now()\n  .toLocalDateTime(TimeZone.currentSystemDefault()).year\nWheelDatePicker(\n  yearsRange = IntRange(currentYear - 50, currentYear),\n  dateFormatter = dateFormatter(dateOrder = DateOrder.DMY)\n) { snappedDate -\u003e }\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eChinese/Japanese/Korean Format\u003c/b\u003e\u003c/summary\u003e\n\nWith native year-month-day suffixes:\n- Chinese: \"2025年1月15日\"\n- Korean: \"2025년1월15일\"\n- Japanese: \"2025年1月15日\"\n\n```kotlin\nWheelDatePicker(\n  dateFormatter = dateFormatter(\n    locale = Locale(\"zh\"),  // \"zh\" for Chinese, \"ja\" for Japanese, \"ko\" for Korean\n    monthDisplayStyle = MonthDisplayStyle.NUMERIC,\n    cjkSuffixConfig = CjkSuffixConfig.ShowAll\n  )\n) { snappedDate -\u003e }\n\n// Without suffixes\nWheelDatePicker(\n  dateFormatter = dateFormatter(\n    locale = Locale(\"zh\"),\n    monthDisplayStyle = MonthDisplayStyle.NUMERIC,\n    cjkSuffixConfig = CjkSuffixConfig.HideAll\n  )\n) { snappedDate -\u003e }\n```\n\n\u003e **Note**: This uses the Composable `dateFormatter()` overload. Date order (YMD for CJK) is auto-detected from locale.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eNumeric Month Display\u003c/b\u003e\u003c/summary\u003e\n\nShow months as numbers instead of names:\n\n```kotlin\nWheelDatePicker(\n  dateFormatter = dateFormatter(\n    dateOrder = DateOrder.DMY,  // or MDY, YMD based on your preference\n    monthDisplayStyle = MonthDisplayStyle.NUMERIC\n  )\n) { snappedDate -\u003e }\n```\n\u003c/details\u003e\n\n## Full Customization Example\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\n```kotlin  \nWheelDateTimePicker(\n  startDateTime = LocalDateTime(\n    year = 2025,\n    month = 10,\n    day = 20,\n    hour = 5,\n    minute = 30\n  ),\n  minDateTime = Clock.System\n    .now()\n    .toLocalDateTime(TimeZone.currentSystemDefault()),\n  maxDateTime = LocalDateTime(\n    year = 2025,\n    month = 10,\n    day = 20,\n    hour = 5,\n    minute = 30\n  ),\n  dateFormatter = dateFormatter(\n    locale = Locale.current, \n    monthDisplayStyle = MonthDisplayStyle.SHORT,\n    cjkSuffixConfig = CjkSuffixConfig.HideAll\n  ),\n  timeFormatter = timeFormatter(\n    timeFormat = TimeFormat.HOUR_24\n  ),\n  size = DpSize(200.dp, 100.dp),\n  rowCount = 5,\n  textStyle = MaterialTheme.typography.titleSmall,\n  textColor = Color(0xFFffc300),\n  selectorProperties = WheelPickerDefaults.selectorProperties(\n    enabled = true,\n    shape = RoundedCornerShape(0.dp),\n    color = Color(0xFFf1faee).copy(alpha = 0.2f),\n    border = BorderStroke(2.dp, Color(0xFFf1faee))\n  )\n) { snappedDateTime -\u003e }\n```\n\n\u003c/td\u003e\n\u003ctd\u003e  \n\n\u003cimg src=\"https://user-images.githubusercontent.com/50905347/201922097-86422287-cbd7-40ab-bf3c-5e0475828976.gif\" width=\"256\" height=\"256\"\u003e\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n## API Reference\n\n### WheelDatePicker Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `startDate` | `LocalDate` | `LocalDate.now()` | Initial selected date |\n| `minDate` | `LocalDate` | `LocalDate.EPOCH` | Minimum selectable date |\n| `maxDate` | `LocalDate` | `LocalDate.CYB3R_1N1T_ZOLL` | Maximum selectable date |\n| `yearsRange` | `IntRange?` | `IntRange(minDate.year, maxDate.year)` | Year range to display. **Set to `null` to hide year picker** |\n| `dateFormatter` | `DateFormatter` | Auto-detected | Controls date order, month style, and CJK suffixes |\n| `size` | `DpSize` | `DpSize(256.dp, 128.dp)` | Picker dimensions |\n| `rowCount` | `Int` | `3` | Number of visible rows in the wheel |\n| `textStyle` | `TextStyle` | `MaterialTheme.typography.titleMedium` | Text styling |\n| `textColor` | `Color` | `LocalContentColor.current` | Text color |\n| `selectorProperties` | `SelectorProperties` | Default | Selector appearance (shape, color, border) |\n| `onSnappedDate` | `(LocalDate) -\u003e Unit` | `{}` | Callback when date is selected |\n\n### DateFormatter Options\n\n**DateOrder** (controls field arrangement):\n- `DateOrder.DMY` - Day, Month, Year (Europe, most of world)\n- `DateOrder.MDY` - Month, Day, Year (US)\n- `DateOrder.YMD` - Year, Month, Day (East Asia, ISO 8601)\n\n**MonthDisplayStyle**:\n- `MonthDisplayStyle.FULL` - \"January\", \"February\", etc.\n- `MonthDisplayStyle.SHORT` - \"Jan\", \"Feb\", etc.\n- `MonthDisplayStyle.NUMERIC` - \"1\", \"2\", etc.\n\n**CjkSuffixConfig** (for Chinese/Japanese/Korean):\n- `CjkSuffixConfig.ShowAll` - Shows year/month/day suffixes (Chinese/Japanese: 年/月/日, Korean: 년/월/일)\n- `CjkSuffixConfig.HideAll` - Hides all suffixes\n- Custom: `CjkSuffixConfig(showYearSuffix = true, showMonthSuffix = false, ...)`\n\n### WheelTimePicker Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `startTime` | `LocalTime` | `LocalTime.now()` | Initial selected time |\n| `minTime` | `LocalTime` | `LocalTime.MIN` | Minimum selectable time |\n| `maxTime` | `LocalTime` | `LocalTime.MAX` | Maximum selectable time |\n| `timeFormatter` | `TimeFormatter` | Auto-detected | Controls 12/24 hour format (auto: AM/PM for en-US/GB, 24h for others) |\n| `size` | `DpSize` | `DpSize(128.dp, 128.dp)` | Picker dimensions (narrower than date picker) |\n| Other params | - | Same as `WheelDatePicker` | rowCount, textStyle, textColor, selectorProperties, etc. |\n\n**TimeFormat**:\n- `TimeFormat.HOUR_24` - 24-hour format (00:00 - 23:59)\n- `TimeFormat.AM_PM` - 12-hour format with AM/PM\n\n## Setup\n\n[![Maven Central](https://img.shields.io/maven-central/v/io.github.darkokoa/datetime-wheel-picker?style=flat)](https://central.sonatype.com/artifact/io.github.darkokoa/datetime-wheel-picker/1.1.0)\n\n- Add the Maven Central repository if it is not already there:\n\n```kotlin\nrepositories {\n  mavenCentral()\n}\n```\n\n- In Compose multiplatform projects, add a dependency to the commonMain source set dependencies:\n\n```kotlin\nkotlin {\n  sourceSets {\n    val commonMain by getting {\n      dependencies {\n        implementation(\"io.github.darkokoa:datetime-wheel-picker:\u003cversion\u003e\")\n        implementation(\"org.jetbrains.kotlinx:kotlinx-datetime:0.7.1\")\n      }\n    }\n  }\n}\n\n```\n\n- To use the library in a single-platform project (such as Android project), add a dependency to the dependencies\n  block:\n\n```kotlin\ndependencies {\n  implementation(\"io.github.darkokoa:datetime-wheel-picker:\u003cversion\u003e\")\n  implementation(\"org.jetbrains.kotlinx:kotlinx-datetime:0.7.1\")\n}\n```\n\n- If your minimum Android platform's API level (minSdk) \u003c 26, please\n  enable [Desugaring](https://developer.android.com/studio/write/java8-support#library-desugaring) like this:\n\n```kotlin\ncompileOptions {\n  isCoreLibraryDesugaringEnabled = true\n}\n\n//...\n\ndependencies {\n  coreLibraryDesugaring(\"com.android.tools:desugar_jdk_libs:2.1.5\")\n}\n```\n\n## License\n\nReleased under the [Apache License, Version 2.0](https://opensource.org/license/apache-2-0).\n\n## Thx\n\n[WheelPickerCompose](https://github.com/commandiron/WheelPickerCompose)\n\n[badge-android]: https://img.shields.io/badge/platform-android-6EDB8D.svg?style=flat\n\n[badge-jvm]: https://img.shields.io/badge/platform-jvm-DB413D.svg?style=flat\n\n[badge-ios]: https://img.shields.io/badge/platform-ios-CDCDCD.svg?style=flat\n\n[badge-js]: https://img.shields.io/badge/platform-js-F8DB5D.svg?style=flat\n\n[badge-wasm]: https://img.shields.io/badge/platform-wasm-654FF0.svg?style=flat\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarkokoa%2Fcompose-datetime-wheel-picker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdarkokoa%2Fcompose-datetime-wheel-picker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarkokoa%2Fcompose-datetime-wheel-picker/lists"}