🕌

KotlinとSwiftで日付をいじってみる

2024/05/29に公開

株式会社バニッシュ・スタンダードで提供している「STAFF START」というサービスのアプリ開発を担当している中本です。私事ですが、岩手県からフルリモートで参加してます。ちょっと前までは鶯一辺倒だったのですが、時鳥の鳴き声も聞こえはじめ、そろそろ梅雨かと憂鬱になっているところです。
私、普段はAndroidの開発を担当していますが、前社でiOS開発も行ったことがありました。前々から「AndroidだけでなくiOSもきちんと開発できるエンジニアになりたい!」と思っていたのですが、新機能の実装時、iOS開発を担当させてもらえることになりました。その際、日付を操作する必要があったのですが、Swiftでの日付の扱いが少し簡単なように思いました。両者を比較した記事もあまりなかったので、ここでまとめたいと思います。

作りたいもの

  • 昨日の日付をString(yyyy-MM-dd)形式で出力します

Kotlin

クラシカルの場合

古いAndroidもサポートしている場合、日付はDateクラスで有します。が、このDateクラスのほとんどのメソッドやプロパティはdeprecatedです。なんと1997年に公表されたJava1.1でdeprecatedになったとのこと。。蛇足ですが、KotlinのDateクラスはJavaのDateクラスをラップしているだけなので、中身はJavaのDateクラスです。
実質的に日付の操作をするのはCalendarクラスであり、getTimeメソッドでDateクラスへ値を渡します(Kotlinなのでプロパティでアクセスしています)。その後、StringにするためにはSimpleDateFormatで整形します。

val calendar = Calendar.getInstance()
calendar.add(Calendar.DAY_OF_MONTH, -1)
val date = calendar.time //dateクラスへ変換
val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd")
val dateString = simpleDateFormat.format(date)

2行目のaddの部分を変更することで、日付を自由に変更することができます。
Calendar, Date, SimpleDateFormatと3つのクラスが登場するのでちょっと不便です。ちなみにこれらははスレッドアンセーフです。Coroutineなどと一緒に使う際はご注意ください。なお、弊社のAndroidアプリはminSdkVersionが23であるのため、この手法を用いました。

ちょっと最近の場合

minSdkVersionが26以上の場合、LocalDateクラスが使えます。こちらの方が簡単に計算できます。

val localDate = LocalDate.now()
val localDateYesterday = localDate.minusDays(1)
val dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd")
val yesterday = localDateYesterday.format(dateFormat)

登場したクラスはLocalDateとDateTimeFormatterの2つです。1つ減っただけで全然楽に感じます。

Swift

let date = Calendar.current.date(byAdding: .day, value: -1, to: Date())
let formatter: DateFormatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
if let date {
    let yesterday = formatter.string(from: date)
    print(yesterday)
}

CalendarとDateはstructで、DateFormatterがclassになります。クラシカルなKotlinと同じように、日付自体はDate型で有しており、日付を計算(ここでは1日前にする)するためにCalandarを用いています。しかし、SwiftのDate型はスレッドセーフであるなど、ほとんどがDeprecatedなkotlin-javaのDateクラスとは使い勝手が大きく異なります。dateが非optionalだったらもっとありがたかったです。笑

最後に

最後までお読みいただきありがとうございます。
私のiOSエンジニアとしての歴は短いのですが、Android/iOS両方できるアプリエンジニアの方の力をお借りして(一部やってもらいつつ)、なんとか新機能をリリースすることができました。
弊社バニッシュスタンダードには「挑戦者であり、勇者であろう」というバリューがあり、実際に文化として根付いています。この文化のおかげで、私は試しにKMMをやってみたり、Swiftをやらせてもらったりすることができました。弊社は随時、エンジニアを募集しています。新しい技術を身につけてエンジニアとして成長したいという方や、弊社が提供しているSTAFF STARTというサービスに興味があり、より良いサービスとして世の中に広めていきたいという方がいましたら、ぜひ応募いただければ幸いです。

Discussion