Skip to content

Commit ec6566c

Browse files
authored
풀 리퀘스트 병합 #38
feature/36 Close #36
2 parents ec974ea + fb515dc commit ec6566c

File tree

5 files changed

+534
-4
lines changed

5 files changed

+534
-4
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ plugins {
1212

1313
project.description = "Kotlin을 위한 java.time.* 확장 함수 라이브러리"
1414
project.group = "io.github.harryjhin"
15-
project.version = "0.13.8"
15+
project.version = "0.14.0"
1616

1717
repositories {
1818
mavenCentral()
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package io.github.harryjhin.java.time.extension
2+
3+
import java.time.Duration
4+
import java.time.LocalDate
5+
import java.time.OffsetDateTime
6+
import java.time.OffsetTime
7+
8+
/**
9+
* [OffsetTime]의 시간을 나타내는 [Duration] 인스턴스를 반환합니다.
10+
*
11+
* @receiver [OffsetTime]
12+
* @return 시간을 나타내는 [Duration] 인스턴스
13+
* @since 0.14.0
14+
* @sample io.github.harryjhin.java.time.extension.OffsetTimeExtensionsTest.hours
15+
*/
16+
val OffsetTime.hours: Duration
17+
get() = Duration.ofHours(hour.toLong())
18+
19+
/**
20+
* [OffsetTime]의 분을 나타내는 [Duration] 인스턴스를 반환합니다.
21+
*
22+
* @receiver [OffsetTime]
23+
* @return 분을 나타내는 [Duration] 인스턴스
24+
* @since 0.14.0
25+
* @sample io.github.harryjhin.java.time.extension.OffsetTimeExtensionsTest.minutes
26+
*/
27+
val OffsetTime.minutes: Duration
28+
get() = Duration.ofMinutes(minute.toLong())
29+
30+
/**
31+
* [OffsetTime]의 초를 나타내는 [Duration] 인스턴스를 반환합니다.
32+
*
33+
* @receiver [OffsetTime]
34+
* @return 초를 나타내는 [Duration] 인스턴스
35+
* @since 0.14.0
36+
* @sample io.github.harryjhin.java.time.extension.OffsetTimeExtensionsTest.seconds
37+
*/
38+
val OffsetTime.seconds: Duration
39+
get() = Duration.ofSeconds(second.toLong())
40+
41+
/**
42+
* [OffsetTime]의 나노초를 밀리초 단위까지 나타내는 [Duration] 인스턴스를 반환합니다.
43+
*
44+
* @receiver [OffsetTime]
45+
* @return 나노초를 밀리초 단위까지 나타내는 [Duration] 인스턴스
46+
* @since 0.14.0
47+
* @sample io.github.harryjhin.java.time.extension.OffsetTimeExtensionsTest.milliseconds
48+
*/
49+
val OffsetTime.milliseconds: Duration
50+
get() = Duration.ofNanos(nano / 1_000_000L * 1_000_000L)
51+
52+
/**
53+
* [OffsetTime]의 나노초를 마이크로초 단위까지 나타내는 [Duration] 인스턴스를 반환합니다.
54+
*
55+
* @receiver [OffsetTime]
56+
* @return 나노초를 마이크로초 단위까지 나타내는 [Duration] 인스턴스
57+
* @since 0.14.0
58+
* @sample io.github.harryjhin.java.time.extension.OffsetTimeExtensionsTest.microseconds
59+
*/
60+
val OffsetTime.microseconds: Duration
61+
get() = Duration.ofNanos(nano / 1_000L * 1_000L)
62+
63+
/**
64+
* [OffsetTime]의 나노초를 나노초 단위까지 나타내는 [Duration] 인스턴스를 반환합니다.
65+
*
66+
* @receiver [OffsetTime]
67+
* @return 나노초를 나노초 단위까지 나타내는 [Duration] 인스턴스
68+
* @since 0.14.0
69+
* @sample io.github.harryjhin.java.time.extension.OffsetTimeExtensionsTest.nanoseconds
70+
*/
71+
val OffsetTime.nanoseconds: Duration
72+
get() = Duration.ofNanos(nano.toLong())
73+
74+
/**
75+
* [OffsetTime]을 [LocalDate]와 결합하여 [OffsetDateTime]으로 변환합니다.
76+
*
77+
* @receiver [OffsetTime]
78+
* @param date [LocalDate]
79+
* @return 결합된 [OffsetDateTime]
80+
* @since 0.14.0
81+
* @sample io.github.harryjhin.java.time.extension.OffsetTimeExtensionsTest.at
82+
*/
83+
infix fun OffsetTime.at(date: LocalDate): OffsetDateTime {
84+
return date.atTime(this)
85+
}
86+
87+
/**
88+
* 두 [OffsetTime] 사이의 기간을 [Duration]으로 계산합니다.
89+
*
90+
* @receiver 시작 시점
91+
* @param endOffsetTime 끝 시점
92+
* @return 시작 시점부터 끝 시점까지의 기간
93+
* @since 0.14.0
94+
* @sample io.github.harryjhin.java.time.extension.OffsetTimeExtensionsTest.between
95+
*/
96+
infix fun OffsetTime.between(
97+
endOffsetTime: OffsetTime,
98+
): Duration {
99+
return Duration.between(this, endOffsetTime)
100+
}

src/main/kotlin/io/github/harryjhin/java/time/extension/StringExtensions.kt

Lines changed: 100 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import java.time.LocalTime
88
import java.time.Month
99
import java.time.MonthDay
1010
import java.time.OffsetDateTime
11+
import java.time.OffsetTime
1112
import java.time.Period
1213
import java.time.Year
1314
import java.time.YearMonth
@@ -864,9 +865,105 @@ fun String.toLocalTimeOrNull(
864865
}
865866
}
866867

867-
//fun String.toOffsetTime(): OffsetTime {
868-
// return toOffsetTime(FORMATTER_OFFSET_TIME)
869-
//}
868+
/**
869+
* [String]을 [OffsetTime]로 변환합니다.
870+
*
871+
* @receiver 오프셋 시간 문자열 (설정된 형식에 맞는)
872+
* @return [OffsetTime] 인스턴스
873+
* @throws DateTimeParseException 문자열 분석에 실패한 경우
874+
* @since 0.14.0
875+
* @sample io.github.harryjhin.java.time.extension.StringExtensionsTest.toOffsetTime
876+
*/
877+
fun String.toOffsetTime(): OffsetTime {
878+
return toOffsetTime(JavaTimeExtensionConfiguration.FORMATTER_OFFSET_TIME)
879+
}
880+
881+
/**
882+
* [String]을 [OffsetTime]로 변환합니다.
883+
*
884+
* @receiver 오프셋 시간 문자열
885+
* @param pattern 시간 패턴 문자열
886+
* @return [OffsetTime] 인스턴스
887+
* @throws DateTimeParseException 문자열 분석에 실패한 경우
888+
* @since 0.14.0
889+
* @sample io.github.harryjhin.java.time.extension.StringExtensionsTest.toOffsetTimeWithString
890+
*/
891+
fun String.toOffsetTime(
892+
pattern: String,
893+
): OffsetTime {
894+
val formatter = pattern.toDateTimeFormatter()
895+
return toOffsetTime(formatter)
896+
}
897+
898+
/**
899+
* [String]을 [OffsetTime]로 변환합니다.
900+
*
901+
* @receiver 오프셋 시간 문자열
902+
* @param formatter 시간 포맷터
903+
* @return [OffsetTime] 인스턴스
904+
* @throws DateTimeParseException 문자열 분석에 실패한 경우
905+
* @since 0.14.0
906+
* @sample io.github.harryjhin.java.time.extension.StringExtensionsTest.toOffsetTimeWithDateTimeFormatter
907+
*/
908+
fun String.toOffsetTime(
909+
formatter: DateTimeFormatter,
910+
): OffsetTime {
911+
return OffsetTime.parse(this, formatter)
912+
}
913+
914+
/**
915+
* [String]을 [OffsetTime]로 변환합니다. 변환에 실패하면 `null`을 반환합니다.
916+
*
917+
* @receiver 오프셋 시간 문자열
918+
* @return [OffsetTime] 인스턴스
919+
* @since 0.14.0
920+
* @sample io.github.harryjhin.java.time.extension.StringExtensionsTest.toOffsetTimeOrNull
921+
*/
922+
fun String.toOffsetTimeOrNull(): OffsetTime? {
923+
return try {
924+
toOffsetTime()
925+
} catch (e: Exception) {
926+
null
927+
}
928+
}
929+
930+
/**
931+
* [String]을 [OffsetTime]로 변환합니다. 변환에 실패하면 `null`을 반환합니다.
932+
*
933+
* @receiver 오프셋 시간 문자열
934+
* @param pattern 시간 패턴 문자열
935+
* @return [OffsetTime] 인스턴스
936+
* @since 0.14.0
937+
* @sample io.github.harryjhin.java.time.extension.StringExtensionsTest.toOffsetTimeOrNullWithString
938+
*/
939+
fun String.toOffsetTimeOrNull(
940+
pattern: String,
941+
): OffsetTime? {
942+
return try {
943+
toOffsetTime(pattern)
944+
} catch (e: Exception) {
945+
null
946+
}
947+
}
948+
949+
/**
950+
* [String]을 [OffsetTime]로 변환합니다. 변환에 실패하면 `null`을 반환합니다.
951+
*
952+
* @receiver 오프셋 시간 문자열
953+
* @param formatter 시간 포맷터
954+
* @return [OffsetTime] 인스턴스
955+
* @since 0.14.0
956+
* @sample io.github.harryjhin.java.time.extension.StringExtensionsTest.toOffsetTimeOrNullWithDateTimeFormatter
957+
*/
958+
fun String.toOffsetTimeOrNull(
959+
formatter: DateTimeFormatter,
960+
): OffsetTime? {
961+
return try {
962+
toOffsetTime(formatter)
963+
} catch (e: Exception) {
964+
null
965+
}
966+
}
870967

871968
/**
872969
* 주어진 일시 문자열을 [LocalDateTime]으로 파싱합니다. 기본 포맷 "yyyy-MM-dd'T'HH:mm:ss"를 사용합니다.

0 commit comments

Comments
 (0)