Skip to content

Commit

Permalink
publish
Browse files Browse the repository at this point in the history
  • Loading branch information
kuluna committed Apr 30, 2020
1 parent 0b06a96 commit 46b3868
Show file tree
Hide file tree
Showing 8 changed files with 138 additions and 24 deletions.
43 changes: 43 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
DateUtilsCompat
---

[![Download](https://api.bintray.com/packages/kuluna/maven/dateutilscompat/images/download.svg) ](https://bintray.com/kuluna/maven/dateutilscompat/_latestVersion)

Androidの言語設定に従って2つの日付の範囲を文字列にフォーマットします。
Androidの[DateUtils.formatDateRange]は日本語のみ出力結果が微妙に異なります。

- 同じ日付の場合は 4月29日 13時37分~15時37分
- 日付が異なる場合 4月29日 13:37~4月30日 13:37
- 年が異なる場合 2020年4月29日 13:37~2021年4月29日 13:37

と「時分」と「:」の2パターンが出力されてしまいます。DateUtilsCompatはそのどちらかに揃えて出力します。日本語以外はオリジナルのDateUtilsと同じ動きをします。

# Install
```
implementation 'jp.kuluna:dateutilscompat:1.0.0'
```
# Usage

```kotlin
// DateUtils.formatDateTime(context, start, DateUtils.FORMAT_SHOW_DATE. or DateUtils.FORMAT_SHOW_TIME)

DateUtilsCompat.formatDateTime(context, start, DateUtils.FORMAT_SHOW_DATE or DateUtils.FORMAT_SHOW_TIME)
// 4月29日 13:37

// DateUtils.formatDateRange(context, start, end, DateUtils.FORMAT_SHOW_DATE. or DateUtils.FORMAT_SHOW_TIME)

DateUtilsCompat.formatDateRange(context, start, end, DateUtils.FORMAT_SHOW_DATE. or DateUtils.FORMAT_SHOW_TIME)
// 4月29日 13:37分~15:37
```

## Custom
```kotlin
DateUtilsCompat.formatDateTime(context, start, DateUtils.FORMAT_SHOW_DATE. or DateUtils.FORMAT_SHOW_TIME, DateUtilsCompat.COLON)
// 4月29日 13:37

DateUtilsCompat.formatDateTime(context, start, DateUtils.FORMAT_SHOW_DATE. or DateUtils.FORMAT_SHOW_TIME, DateUtilsCompat.KANJI)
// 4月29日 13時37分
```

# License
MIT License.
2 changes: 0 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@ dependencies {
implementation project(path: ':dateutilscompat')

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class MainActivity : AppCompatActivity() {

val now = Date()
val twoHoursLater = Calendar.getInstance().run {
add(Calendar.HOUR_OF_DAY, 2)
add(Calendar.HOUR_OF_DAY, 1)
time
}
val tomorrow = Calendar.getInstance().run {
Expand Down Expand Up @@ -54,12 +54,16 @@ class MainActivity : AppCompatActivity() {
DateUtils.FORMAT_SHOW_DATE or DateUtils.FORMAT_SHOW_TIME
)

DateUtils.formatDateTime(this, Date().time, 0)
DateUtils.formatDateRange(this, Date().time, Date().time, 0)
DateUtils.getRelativeTimeSpanString(Date().time)

Log.i(localClassName, hourRangeString)
Log.i(localClassName, dayRangeString)
Log.i(localClassName, yearRangeString)


val nowString = DateUtilsCompat.formatDateTime(
this, now.time,
DateUtils.FORMAT_SHOW_DATE or DateUtils.FORMAT_SHOW_TIME
)

Log.i(localClassName, nowString)
}
}
12 changes: 4 additions & 8 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
Expand All @@ -9,10 +8,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
android:layout_gravity="center"
android:text="Hello World!" />

</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
2 changes: 1 addition & 1 deletion app/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import com.intellij.psi.PsiMethod
import org.jetbrains.uast.UCallExpression

class DateUtilsLint : Detector(), SourceCodeScanner {
override fun getApplicableMethodNames(): List<String>? = listOf("formatDateRange")
override fun getApplicableMethodNames(): List<String>? =
listOf("formatDateTime", "formatDateRange")

override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
super.visitMethodCall(context, node, method)
Expand Down
2 changes: 1 addition & 1 deletion dateutilscompat/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ publish {
userOrg = "kuluna"
groupId = "jp.kuluna"
artifactId = 'dateutilscompat'
publishVersion = '0.0.1'
publishVersion = '1.0.0'
desc = "Fix DateUtils format time in Japanese language."
dryRun = false
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,99 @@ import android.content.Context
import android.text.format.DateUtils
import java.util.*

/**
* Androidの日付ユーティリティクラスの[DateUtils]の一部処理を日本語環境のために置き換えるクラスです。
*/
enum class DateUtilsCompat {
/**
* 時刻の出力を漢字形式にします。
*
* - 11時00分〜13時00分
* - 午前11時00分〜午後1時00分
*/
KANJI,

/**
* 時刻の出力をコロン「:」形式にします。
*
* 11:00〜13:00
* 午前11:00〜午後1:00
*/
COLON;

companion object {
/**
* Androidの言語設定に従って日付を文字列にフォーマットします。
*
* Androidの[DateUtils.formatDateTime]は[DateUtils.formatDateRange]でフォーマットされる結果が
* 日本語のみ微妙に異なります。
* [DateUtilsCompat.formatDateRange]を使う場合はこちらも併せて使うことを推奨します。
*
* - 4月29日 13時37分
* - 4月29日 13:37
*
* と「時分」と「:」の2パターンのどちらかに揃えて出力します。
* 日本語以外はオリジナルのDateUtilsと同じ動きをします。
*
* @param context Android [Context]
* @param millis UTCミリ秒
* @param flags [DateUtils]のフラグに合わせてフォーマットします
* @param formatTimeType 時刻フォーマットを「時分」と「:」のどちらに揃えるか指定します
* @return フォーマットされた文字列
*
* @see DateUtils.formatDateTime
*/
fun formatDateTime(
context: Context,
millis: Long,
flags: Int,
formatTimeType: DateUtilsCompat = COLON
): String {
val string = DateUtils.formatDateTime(context, millis, flags)
return adjustForJapanese(string, formatTimeType)
}

/**
* Androidの言語設定に従って2つの日付の範囲を文字列にフォーマットします。
*
* Androidの[DateUtils.formatDateRange]は日本語のみ出力結果が微妙に異なります。
* - 同じ日付の場合は 4月29日 13時37分~15時37分
* - 日付が異なる場合 4月29日 13:37~4月30日 13:37
* - 年が異なる場合 2020年4月29日 13:37~2021年4月29日 13:37
*
* と「時分」と「:」の2パターンが出力されてしまいます。この関数はそのどちらかに揃えて出力します。
* 日本語以外はオリジナルのDateUtilsと同じ動きをします。
*
* @param context Android [Context]
* @param startMillis 開始時刻のUTCミリ秒
* @param endMillis 終了時刻のUTCミリ秒
* @param flags [DateUtils]のフラグに合わせてフォーマットします
* @param formatTimeType 時刻フォーマットを「時分」と「:」のどちらに揃えるか指定します
* @return フォーマットされた文字列
*
* @see DateUtils.formatDateRange
*/
fun formatDateRange(
context: Context,
startMillis: Long,
endMillis: Long,
flags: Int,
formatTimeType: DateUtilsCompat = COLON
): String {
var string = DateUtils.formatDateRange(context, startMillis, endMillis, flags)
val string = DateUtils.formatDateRange(context, startMillis, endMillis, flags)
return adjustForJapanese(string, formatTimeType)
}

private fun adjustForJapanese(formatted: String, formatTimeType: DateUtilsCompat): String {
val locale = Locale.getDefault()
if (locale.language == Locale.JAPANESE.language) {
string = when (formatTimeType) {
KANJI -> string.replace(Regex("(\\d{1,2}):(\\d{1,2})"), "$1時$2分")
COLON -> string.replace(Regex("(\\d{1,2})時(\\d{1,2})分"), "$1:$2")
return if (locale.language == Locale.JAPANESE.language) {
when (formatTimeType) {
KANJI -> formatted.replace(Regex("(\\d{1,2}):(\\d{1,2})"), "$1時$2分")
COLON -> formatted.replace(Regex("(\\d{1,2})時(\\d{1,2})分"), "$1:$2")
}
} else {
formatted
}
return string
}
}
}

0 comments on commit 46b3868

Please sign in to comment.