$30 off During Our Annual Pro Sale. View Details »

DateComponentsと仲良くなる

sato-shin
September 19, 2021

 DateComponentsと仲良くなる

iOSDC 2021で発表したスライドです。
* asken tech blog: https://tech.asken.inc
* youtube link: アップロードされたら

sato-shin

September 19, 2021
Tweet

More Decks by sato-shin

Other Decks in Programming

Transcript

  1. TBUPTIJO!BTLFO*OD
    %BUF$PNQPOFOUTͱ
    ஥ྑ͘ͳΔɹ
    J04%$+BQBO

    View Slide

  2. ຊηογϣϯʹ͍ͭͯ
    %BUF$PNQPOFOUTͱ஥ྑ͘ͳΔɹ

    View Slide

  3. ຊηογϣϯʹ͍ͭͯ
    %BUF$PNQPOFOUTͱ஥ྑ͘ͳΔɹ
    ࠓɺ೤͍࿩୊ʁ

    View Slide

  4. ຊηογϣϯʹ͍ͭͯ
    %BUF$PNQPOFOUTͱ஥ྑ͘ͳΔɹ
    ࠓɺ೤͍࿩୊ʁ
    %BUF$PNQPOFOUT͸J04

    View Slide

  5. ຊηογϣϯʹ͍ͭͯ
    %BUF$PNQPOFOUTͱ஥ྑ͘ͳΔɹ
    J04ʹؔ͢Δʁ

    View Slide

  6. ຊηογϣϯʹ͍ͭͯ
    %BUF$PNQPOFOUTͱ஥ྑ͘ͳΔɹ
    J04ʹؔ͢Δʁ

    View Slide

  7. ຊηογϣϯʹ͍ͭͯ
    %BUF$PNQPOFOUTͱ஥ྑ͘ͳΔɹ
    ೔࣌ܭࢉΛ%BUFͰࡁ·ͤͪΌͬͯΔਓ
    %BUF$PNQPOFOUTΛ͋Μ·Γ࢖ͬͨ͜ͱ͕ͳ͍ਓ
    ͦΜͳਓͷͨΊͷηογϣϯͰ͢ɻ

    View Slide

  8. ࣌ؒͷجૅ

    View Slide

  9. ࣌ؒ͸ͲͷΑ͏ʹఆٛ͞ΕΔʁ

    View Slide

  10. ࣌ؒ͸ͲͷΑ͏ʹఆٛ͞ΕΔʁ
    ࣌ؒ࣠

    View Slide

  11. ࣌ؒ͸ͲͷΑ͏ʹఆٛ͞ΕΔʁ

    ࣌ؒ࣠

    View Slide

  12. ࣌ؒ͸ͲͷΑ͏ʹఆٛ͞ΕΔʁ

    ج४఺
    ࣌ؒ࣠

    View Slide

  13. ࣌ؒ͸ͲͷΑ͏ʹఆٛ͞ΕΔʁ

    ج४఺
    ௕͞
    ࣌ؒ࣠

    View Slide

  14. ࣌ؒ͸ͲͷΑ͏ʹఆٛ͞ΕΔʁ

    ج४఺
    ௕͞
    ࣌ؒ࣠
    ༗໊ͳج४఺ɿ
    6/*9ΤϙοΫ 65$

    View Slide

  15. ࣌ؒ͸ͲͷΑ͏ʹఆٛ͞ΕΔʁ

    ج४఺
    ௕͞<ඵ>
    ࠃࡍ୯Ґܥʢ4*ʣͰఆٛ͞ΕΔ࣌ؒͷ୯Ґ͕ඵ
    ࣌ؒ࣠
    ༗໊ͳج४఺ɿ
    6/*9ΤϙοΫ 65$

    View Slide

  16. 4XJGUͰ࣌ؒΛදݱ͢Δܕ͸ʁ
    %BUF

    View Slide

  17. 4XJGUͰ͸ͲͷΑ͏ʹදݱ͞ΕΔʁ
    %BUF
    init(timeIntervalSinceNow: )
    init(timeIntervalSince1970: )
    init(timeIntervalSinceReferenceDate: )
    init(timeInterval: since: )
    init()

    View Slide

  18. 4XJGUͰ͸ͲͷΑ͏ʹදݱ͞ΕΔʁ
    init(timeIntervalSinceNow: )
    init(timeIntervalSince1970: )
    init(timeIntervalSinceReferenceDate: )
    init(timeInterval: since: )
    init()
    %BUF

    View Slide

  19. 4XJGUͰ͸ͲͷΑ͏ʹදݱ͞ΕΔʁ
    init(timeIntervalSinceNow: )
    init(timeIntervalSince1970: )
    init(timeIntervalSinceReferenceDate: )
    init(timeInterval: since: )
    init() = init(timeIntervalSinceNow: 0)
    %BUF

    View Slide

  20. %BUF㱠೔෇
    %BUF࣌ؒͷ఺

    View Slide

  21. ೥ʁ݄ʁ೔ʁ
    ඵ͔͠஌Βͳ͍Αʂ
    %BUF㱠೔෇
    %BUF࣌ؒͷ఺

    View Slide

  22. ೔࣌ܭࢉͷ೉͠͞

    View Slide

  23. ଍͠ࢉ͢Δ
    let after10Sec = Date() + 10
    let after1Minute = Date() + 60
    let after1Day = Date() + (60 * 60 * 24)
    let after1Month = Date() + (60 * 60 * 24 * 30)

    View Slide

  24. ଍͠ࢉ͢Δ
    !
    let after10Sec = Date() + 10
    let after1Minute = Date() + 60
    let after1Day = Date() + (60 * 60 * 24)
    let after1Month = Date() + (60 * 60 * 24 * 30)

    View Slide

  25. ೔࣌ܭࢉͰߟྀ͠ͳ͚Ε͹͍͚ͳ͍͜ͱ
    ͏Δ͏೥ͷଘࡏ
    ϲ݄ͷఆٛ
    αϚʔλΠϜ
    ͏Δ͏ඵͷଘࡏ
    ೥ ೔
    ϲ݄ ೔
    ೔ ࣌ؒ
    ෼ ඵ

    View Slide

  26. ʌůɾ㱼ɾA
    ŷžŷž

    View Slide

  27. ೔࣌ܭࢉΫϥε$BMFOEBS

    View Slide

  28. ೔࣌ܭࢉΫϥε$BMFOEBS
    let calendar = Calendar(identifier: .gregorian)
    let after1Month =
    calendar.date(byAdding: .month, value: 1, to: Date())

    View Slide

  29. ໰୊
    ʮੜ೥݄೔Λ%BUFͰදݱͰ͖Δ͔ʁʯ

    View Slide

  30. ੜ೥݄೔Λ%BUFͰදݱͯ͠ΈΔ
    let birthday =
    Date(timeIntervalSince1970: 656_175_600)
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    formatter.timeZone = TimeZone(abbreviation: "UTC")
    print(formatter.string(from: birthday))

    View Slide

  31. ੜ೥݄೔Λ%BUFͰදݱͯ͠ΈΔ
    let birthday =
    Date(timeIntervalSince1970: 656_175_600)
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    formatter.timeZone = TimeZone(abbreviation: "UTC")
    print(formatter.string(from: birthday))
    1990-10-18
    00:00:00 +09:00

    View Slide

  32. ੜ೥݄೔Λ%BUFͰදݱͯ͠ΈΔ
    let birthday =
    Date(timeIntervalSince1970: 656_175_600)
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    formatter.timeZone = TimeZone(abbreviation: "UTC")
    print(formatter.string(from: birthday))
    1990-10-18
    00:00:00 +09:00
    1990-10-17

    View Slide

  33. %BUF࣌ؒͷ఺
    ஀ੜ೔ͳͲͷදݱʹ͸޲͔ͳ͍

    View Slide

  34. %BUF࣌ؒͷ఺
    ੜ೥݄೔ͳͲͷදݱʹ͸޲͔ͳ͍

    View Slide

  35. %BUF࣌ؒͷ఺
    ੜ೥݄೔ͳͲͷදݱʹ͸޲͔ͳ͍
    ࠓ೔ɺࠓ݄ɺࠓ೥ɺه೦೔ɺFUD
    λΠϜκʔϯʹґଘ͠ͳ͍೔࣌Λਖ਼֬ʹදݱͰ͖ͳ͍

    View Slide

  36. ೔෇ͰදݱͰ͖Δܕ͕͋ͬͨΒͳ͊ɻɻɻ

    View Slide

  37. %BUF$PNQPOFOUT

    View Slide

  38. let calendar = Calendar(identifier: .gregorian)
    let birthday =
    DateComponents(calendar: calendar,
    year: 1990, month: 10, day: 18)

    View Slide

  39. %BUF$PNQPOFOUTͷ
    *OJUJBMJ[FS͔Βಛ௃ΛݟΔ

    View Slide

  40. %BUF$PNQPOFOUT
    JOJUJBMJ[FS
    DateComponents(calendar: Calendar?, timeZone: TimeZone?,
    era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?,
    minute: Int?, second: Int?, nanosecond: Int?,
    weekday: Int?, weekdayOrdinal: Int?, quarter: Int?,
    weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)

    View Slide

  41. ͭш㱬
    ŠƄŢŠƄŢ

    View Slide

  42. %BUF$PNQPOFOUT
    JOJUJBMJ[FS
    DateComponents(calendar: Calendar?, timeZone: TimeZone?,
    era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?,
    minute: Int?, second: Int?, nanosecond: Int?,
    weekday: Int?, weekdayOrdinal: Int?, quarter: Int?,
    weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)

    View Slide

  43. %BUF$PNQPOFOUT
    JOJUJBMJ[FS
    ͳΜͱҾ਺ݸʂ
    DateComponents(calendar: Calendar?, timeZone: TimeZone?,
    era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?,
    minute: Int?, second: Int?, nanosecond: Int?,
    weekday: Int?, weekdayOrdinal: Int?, quarter: Int?,
    weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)

    View Slide

  44. %BUF$PNQPOFOUT
    ೔࣌Λߏ੒͢Δཁૉ܈

    View Slide

  45. %BUF$PNQPOFOUT
    JOJUJBMJ[FS
    શͯ೔࣌ͷߏ੒ཁૉ
    DateComponents(calendar: Calendar?, timeZone: TimeZone?,
    era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?,
    minute: Int?, second: Int?, nanosecond: Int?,
    weekday: Int?, weekdayOrdinal: Int?, quarter: Int?,
    weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)

    View Slide

  46. ͭͷཁૉຖ͸؆୯

    View Slide

  47. %BUF$PNQPOFOUT
    JOJUJBMJ[FS
    ΧϨϯμʔ
    DateComponents(calendar: Calendar?, timeZone: TimeZone?,
    era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?,
    minute: Int?, second: Int?, nanosecond: Int?,
    weekday: Int?, weekdayOrdinal: Int?, quarter: Int?,
    weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)

    View Slide

  48. %BUF$PNQPOFOUT
    JOJUJBMJ[FS
    λΠϜκʔϯ
    DateComponents(calendar: Calendar?, timeZone: TimeZone?,
    era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?,
    minute: Int?, second: Int?, nanosecond: Int?,
    weekday: Int?, weekdayOrdinal: Int?, quarter: Int?,
    weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)

    View Slide

  49. %BUF$PNQPOFOUT
    JOJUJBMJ[FS
    ࣌୅ ݩ߸ HSFHPSJBOΧϨϯμʔͷ৔߹
    لݩલ
    ੢ྐྵ
    ࿨ྐྵΧϨϯμʔͷ৔߹
    େԽ
    ฏ੒
    ྩ࿨
    DateComponents(calendar: Calendar?, timeZone: TimeZone?,
    era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?,
    minute: Int?, second: Int?, nanosecond: Int?,
    weekday: Int?, weekdayOrdinal: Int?, quarter: Int?,
    weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)

    View Slide

  50. %BUF$PNQPOFOUT
    JOJUJBMJ[FS
    ೥݄೔࣌෼ඵφϊඵ
    DateComponents(calendar: Calendar?, timeZone: TimeZone?,
    era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?,
    minute: Int?, second: Int?, nanosecond: Int?,
    weekday: Int?, weekdayOrdinal: Int?, quarter: Int?,
    weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)

    View Slide

  51. %BUF$PNQPOFOUT
    JOJUJBMJ[FS
    ༵೔
    DateComponents(calendar: Calendar?, timeZone: TimeZone?,
    era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?,
    minute: Int?, second: Int?, nanosecond: Int?,
    weekday: Int?, weekdayOrdinal: Int?, quarter: Int?,
    weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)

    View Slide

  52. %BUF$PNQPOFOUT
    JOJUJBMJ[FS
    ͦͷ༵೔͕Կ൪໨͔
    DateComponents(calendar: Calendar?, timeZone: TimeZone?,
    era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?,
    minute: Int?, second: Int?, nanosecond: Int?,
    weekday: Int?, weekdayOrdinal: Int?, quarter: Int?,
    weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)
    ݄ͷୈ ೔༵೔

    View Slide

  53. %BUF$PNQPOFOUT
    JOJUJBMJ[FS
    ࢛൒ظ
    DateComponents(calendar: Calendar?, timeZone: TimeZone?,
    era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?,
    minute: Int?, second: Int?, nanosecond: Int?,
    weekday: Int?, weekdayOrdinal: Int?, quarter: Int?,
    weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)

    View Slide

  54. %BUF$PNQPOFOUT
    JOJUJBMJ[FS
    ͦͷ݄ͷԿि໨͔
    DateComponents(calendar: Calendar?, timeZone: TimeZone?,
    era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?,
    minute: Int?, second: Int?, nanosecond: Int?,
    weekday: Int?, weekdayOrdinal: Int?, quarter: Int?,
    weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)
    ݄ͷୈि໨

    View Slide

  55. %BUF$PNQPOFOUT
    JOJUJBMJ[FS
    ͦͷ೥ͷԿि໨͔
    DateComponents(calendar: Calendar?, timeZone: TimeZone?,
    era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?,
    minute: Int?, second: Int?, nanosecond: Int?,
    weekday: Int?, weekdayOrdinal: Int?, quarter: Int?,
    weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)

    View Slide

  56. %BUF$PNQPOFOUT
    JOJUJBMJ[FS
    ೥ʢXFFLPGZFBS༻ʣ
    DateComponents(calendar: Calendar?, timeZone: TimeZone?,
    era: Int?, year: Int?, month: Int?, day: Int?, hour: Int?,
    minute: Int?, second: Int?, nanosecond: Int?,
    weekday: Int?, weekdayOrdinal: Int?, quarter: Int?,
    weekOfMonth: Int?, weekOfYear: Int?, yearForWeekOfYear: Int?)

    View Slide

  57. %BUF$PNQPOFOUT͸Ͳ͏࢖͏ʁ

    View Slide

  58. ࡾͭͷ໾ׂ
    ೔࣌

    ύλʔϯϚον

    View Slide

  59. ࡾͭͷ໾ׂ
    ೔࣌
    %BUF$PNQPOFOUT%BUF

    View Slide

  60. ೔࣌
    DateComponents => Date
    let today =
    DateComponents(calendar: gregorianCalendar,
    year: 2021, month: 9, day: 19)
    var todayInJp = today
    todayInJp.timeZone = TimeZone(abbreviation: "JST")
    todayInJp.date // 2021-09-19 00:00:00 +09:00

    View Slide

  61. ೔࣌
    DateComponents => Date
    let today =
    DateComponents(calendar: gregorianCalendar,
    year: 2021, month: 9, day: 19)
    var todayInJp = today
    todayInJp.timeZone = TimeZone(abbreviation: "JST")
    todayInJp.date // 2021-09-19 00:00:00 +09:00

    View Slide

  62. ೔࣌
    Date => DateComponents
    let today = gregorianCalendar
    .dateComponents([.calendar, .year, .month, .day],
    from: Date())

    View Slide

  63. ೔࣌
    let today = gregorianCalendar
    .dateComponents([.calendar, .year, .month, .day],
    from: Date())
    Date͔Β
    Calendarͱ೥݄೔͕ઃఆ͞Εͨ
    DateComponentsΛੜ੒
    Date => DateComponents

    View Slide

  64. ʮࠓ೔ʯͷදݱྫ

    View Slide

  65. ʮࠓ೔ʯͷදݱྫ

    View Slide

  66. ೔࣌
    ʮࠓ೔ʯͷදݱྫ
    // 2021೥9݄19೔
    let today =
    DateComponents(calendar: gregorianCalendar,
    year: 2021, month: 9, day: 19)
    today.isValidDate // true

    View Slide

  67. ೔࣌
    ʮࠓ೔ʯͷදݱྫ
    // 2021೥9݄ͷୈ3,೔༵೔
    let today =
    DateComponents(calendar: gregorianCalendar,
    year: 2021, month: 9,
    weekday: 1, weekdayOrdinal: 3)
    today.isValidDate // true

    View Slide

  68. ೔࣌
    ʮࠓ೔ʯͷදݱྫ
    // 2021೥ͷ262೔໨
    let today =
    DateComponents(calendar: gregorianCalendar,
    year: 2021, day: 262)
    today.isValidDate // false

    View Slide

  69. ೔࣌
    ʮࠓ೔ʯͷදݱྫʢ❌ʣ
    // 2021೥ͷ262೔໨
    let today =
    DateComponents(calendar: gregorianCalendar,
    year: 2021, day: 262)
    today.isValidDate // false
    2021೥1݄262೔ͱ൑ఆ͞Εɺfalse

    View Slide

  70. ೔࣌
    ʮࠓ೔ʯͷදݱྫ
    // 2021೥ͷୈ38,೔༵೔
    let today =
    DateComponents(calendar: gregorianCalendar,
    year: 2021,
    weekday: 1, weekdayOrdinal: 38)
    today.isValidDate // false

    View Slide

  71. ೔࣌
    ʮࠓ೔ʯͷදݱྫʢ❌ʣ
    // 2021೥ͷୈ38,೔༵೔
    let today =
    DateComponents(calendar: gregorianCalendar,
    year: 2021,
    weekday: 1, weekdayOrdinal: 38)
    today.isValidDate // false
    2021೥1݄ͷୈ38,೔༵೔ͱ
    ൑ఆ͞Εɺfalse

    View Slide

  72. ࡾͭͷ໾ׂ

    ௕͞

    View Slide


  73. ೔࣌ܭࢉͷ͓ڙʹ
    let oneMonth = DateComponents(month: 1) // ̍ϲ݄
    let oneMonthLater =
    calendar.date(byAdding: oneMonth, to: Date())

    View Slide


  74. ೔࣌ܭࢉͷ͓ڙʹ
    let oneMonth = DateComponents(month: 1) // ̍ϲ݄
    let oneMonthLater =
    calendar.date(byAdding: oneMonth, to: Date())

    View Slide

  75. ࡾͭͷ໾ׂ
    ύλʔϯϚον

    View Slide

  76. ύλʔϯϚον
    UserNotificationͷTriggerදݱͳͲ
    let wakeUpAlertTime = DateComponents(hour: 8, minute: 30)
    let trigger = UNCalendarNotificationTrigger(
    dateMatching: wakeUpAlertTime, repeats: true)

    View Slide

  77. ύλʔϯϚον
    UserNotificationͷTriggerදݱͳͲ
    let wakeUpAlertTime = DateComponents(hour: 8, minute: 30)
    let trigger = UNCalendarNotificationTrigger(
    dateMatching: wakeUpAlertTime, repeats: true)

    View Slide

  78. ύλʔϯϚον
    UserNotificationͷTriggerදݱͳͲ
    let wakeUpAlertTime = DateComponents(hour: 8, minute: 30
    weekday: 1)
    let trigger = UNCalendarNotificationTrigger(
    dateMatching: wakeUpAlertTime, repeats: true)

    View Slide

  79. ύλʔϯϚον
    UserNotificationͷTriggerදݱͳͲ
    let wakeUpAlertTime = DateComponents(hour: 8, minute: 30
    weekday: 1)
    let trigger = UNCalendarNotificationTrigger(
    dateMatching: wakeUpAlertTime, repeats: true)
    ೔༵೔ͷ8࣌30෼

    View Slide

  80. 5JQT

    View Slide

  81. 5JQT
    DateComponents(hour: 12)

    View Slide

  82. 5JQT
    ྔΛද͢ͷ࣌ؒʁ
    ύλʔϯϚονͷ࣌ʁ
    DateComponents(hour: 12)

    View Slide

  83. 5JQT
    %BUF$PNQPOFOUT͕ͲΜͳҙຯΛ͔࣋ͭ͸ɺίϯςΩετʹΑͬͯҟͳΔɻ
    ࠞཚ͢Δ৔߹ʹ͸ɺϥούʔΫϥεΛ࡞Δͷ͕͓͢͢Ίɻ
    // ྔతදݱʹݶఆ͢Δ
    struct DateLength {
    var value: DateComponents
    }

    View Slide

  84. ·ͱΊ
    %BUF͸࣌ؒͷ఺Ͱ͋Γɺѻ͏୯Ґ͸ඵͷΈ
    ඵҎ֎୯ҐͰܭࢉΛߦ͏৔߹͸$BMFOEBSΛ࢖͏
    %BUF$PNQPOFOUT͸೔࣌Λߏ੒͢Δཁૉ܈Ͱ
    ओʹʮ೔࣌ɺྔɺύλʔϯϚονʯͷ໾ׂͰ࢖ΘΕΔ

    View Slide

  85. ͚͋͢Μઈࢍ֦େதʂ
    J04%$ΰʔϧυεϙϯαʔɻ͚͋͢ΜϝΨω১͖࢖ͬͯͶʂ
    ࠃ಺ʮϔϧεέΞʯΧςΰϦͰ೥౓ͷ%-਺ɺऩӹ/Pʂ
    5FDIϒϩά࢝Ί·ͨ͠ʂ
    🥇
    📖
    🎩

    View Slide

  86. ͚͋͢Μઈࢍ֦େதʂ
    5FDIϒϩάϦϯΫ
    ຊηογϣϯͷิ଍هࣄ΋ॻ͖·ͨ͠ɻ
    ͥͻνΣοΫͯ͠Έ͍ͯͩ͘͞ʂ
    https://tech.asken.inc

    View Slide

  87. View Slide