[Xcode/SwiftUI] 特定の日付範囲で何かを表示させる (SwiftDate)

Contents 非表示

実装

2025/1/12 9:41:00 ~ 2025/2/12 9:41:00の期間内は画像を表示させる。

HomeViewModel

import SwiftUI
import SwiftDate

final class HomeViewModel: ObservableObject {
    @Published var isShowImage: Bool

    init() {
        isShowImage = Date().isShowImage()
    }
}

extension Date {
    func isShowImage() -> Bool {
        return isInRange(
            date: DateInRegion("2025/1/12 9:41:00", region: .JST)!.date, // 範囲の開始日(2025年1月12日9:41AM JST)
            and: DateInRegion("2025/2/12 9:41:00", region: .JST)!.date, // 範囲の終了日(2025年2月12日9:41AM JST)
            orEqual: true, // 開始日と終了日を範囲に含める
            granularity: .second // 範囲の粒度(秒)
        )
    }
}

extension Region {
    static var JST: Region {
        // カレンダー(グレゴリオ暦)、タイムゾーン(Asia/Tokyo)、ロケール(英語)で地域を作成
        return Region(calendar: Calendar(identifier: .gregorian),
                      zone: Zones.asiaTokyo.toTimezone(),
                      locale: Locale(identifier: "en_US_POSIX"))
    }
}

HomeView

import SwiftUI

struct HomeView: View {
    @StateObject private var viewModel = HomeViewModel()

    var body: some View {
        VStack {
            Label(viewModel.isShowImage ? "Date in Range" : "Date out of Range", systemImage: "calendar")
                .font(.title)
                .padding()
            if viewModel.isShowImage {
                Image("img_pizza")
                    .resizable()
                    .scaledToFit()
            }
        }
    }
}