2019/02/02

Swiftで2つの月日の間の年月、月、日、時間を計算する

 DateTimeの計算において、LocaleとかUTC/GMTとかいろいろな属性を正しく理解していないと、日付計算ができないのだが、、理解度20%ぐらいで、先人のサンプルをCopyして勤務日を計算するコードを作成した。勤務最終日までどれぐらいあるのか、年月、○ヶ月、○日、○時間でそれぞれ計算する。下記のコードの様に何度もdateComponents関数を呼ばないといけないのか?までは分かっておらず。。下記コードは土日・祝日を考慮しない、素の計算コード(実装前の参照コード)


-------------------------------------
let complete = "2020/10/31 17:30:00"   //  (例)勤務最終日

let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat =  "yyyy/MM/dd HH:mm:ss"
let cmplDate = dateFormatter.date(from: complete)

let calendar = Calendar(identifier: .gregorian)
let today:Date = Date()

var components = calendar.dateComponents([.year, .month], from: today , to: cmplDate!)
print(String(components.year!) + "nen" + String(components.month!) + "gatu")

components = calendar.dateComponents([ .month], from: today , to: cmplDate!)
print(String(components.month!) + " mon")

components = calendar.dateComponents([ .day], from: today , to: cmplDate!)
print(String(components.day!) + " days")

components = calendar.dateComponents([ .hour], from: today , to: cmplDate!)
print(String(components.hour!) + " hours")

-------------------------------------
上記の日付計算ルーチンをベースに現在開発中の定年サポートアプリに営業日を表示するように組み込んだ。左の画面のように、定年までの月日、〇ケ月(ここまでは祝日、土日考慮なし)、営業日〇日、勤務時間〇時間を表示してくれる。

 営業日を正確に計算するには、1年365日に対して、土日を抜いて、祝日を抜いて、さらに、振替休日も計算して、、となるのだけど、非常に複雑なので、概算として7割で計算しています。また、労働時間も前記のだいたいの営業日に対して、1営業日を8時間で計算しています。。
 アプリが表示する日程を改めて眺めていると、意外と月が短いという印象。53か月か。。さらに、残りの営業日は1147日(多少誤差あり)となっている。仕事の目標として、1000日に向けてなんとか日々乗り越えたい。しかーし、1000日を切ると定年までの日の進みが段々と加速するような気も(それは良いことなのか悪い事なのか。。どっちだろうか)。。

 アプリ完成までに必要な作業は、、(1)読むとほっこりさせてくれるはずの一言メッセージを実装(WebAPIで取ってくる予定)、(2)最終勤務日を入力するUIを追加、(3)一言メッセージ用のサーバサービスを実装(GoogleSitesでサイトを立ち上げて、特定の記事で代用)、(4)アイコン等のビジュアルを整える。 といったところか。

■ご参考URL
本気&&本物の営業日計算Webページ
https://keisan.casio.jp/exec/system/1251167854

「2018年の年間休日日数は何日」より
https://jpnculture.net/nenkankyuujitu/

週休二日の公務員の場合、年間休日は123日らしい。1年間の勤務日数は242日となり、1年のうちで66%が営業日、34%が休みであると。

No comments:

Post a Comment