当使用 .backward 作为方向时,Calendar.nextDate() 的表现非常奇怪。仅适用于该月的最后一天

2023-11-27

在我的应用程序中,我需要获取之前的凌晨 4 点,而不是当前日期的凌晨 4 点。
例如:

  • if it's March 05, 10:00 am那么我应该期待回来:March 05, 4:00 am
  • if it's March 05, 02:00 am那么我应该期待回来:March 04, 4:00 am

为了实现我正在使用的Calendar.nextDate。它适用于每月的每一天(每月最后一天除外)。

这是快乐路径的示例,它按预期工作:

let components = DateComponents(hour: 4, minute: 0, second: 0)

let date =  Calendar.current.date(from: DateComponents(year: 2018,
                                                       month: 03, 
                                                       day: 05, 
                                                       hour: 13, 
                                                       minute: 25, 
                                                       second: 0))!
let result = Calendar.current.nextDate(after: date, 
                                       matching: components,
                                       matchingPolicy: .nextTime,
                                       direction: .backward)

输出:

date = "Mar 5, 2018 at 1:25 PM"
result = "Mar 5, 2018 at 4:00 AM"

这是黑暗悲伤之路的一个例子,它确实NOT按预期行事:

let components = DateComponents(hour: 4, minute: 0, second: 0)

let date =  Calendar.current.date(from: DateComponents(year: 2018,
                                                       month: 03, 
                                                       day: 31, 
                                                       hour: 13, 
                                                       minute: 25, 
                                                       second: 0))!
let result = Calendar.current.nextDate(after: date, 
                                       matching: components,
                                       matchingPolicy: .nextTime,
                                       direction: .backward)

输出:

date = "Mar 31, 2018 at 1:25 PM"
result = "Mar 30, 2018 at 4:00 AM"
// it should give me this instead: "Mar 31, 2018 at 4:00 AM"

知道为什么会发生这种情况吗?这是苹果代码中的错误吗,我应该报告吗?或者我用错了?
如果这是苹果的错误,是否有其他方法可以同时实现我所需要的?

Update:

在查看了一些 Swift 源代码后,我注意到问题不在于Calendar.nextDate()具体发挥作用。nextDate() uses Calendar.enumerateDates()这就是真正的问题所在。但我找不到该函数的源代码。 这是使用相同的错误Calendar.enumerateDates():

let components = DateComponents(hour: 4, minute: 0, second: 0)

let date =  Calendar.current.date(from: DateComponents(year: 2018,
                                                       month: 03, 
                                                       day: 31, 
                                                       hour: 13, 
                                                       minute: 25, 
                                                       second: 0))!

Calendar.current.enumerateDates(startingAfter: inputDate,
                                matching: components, 
                                matchingPolicy: .nextTime, 
                                direction: .backward) { (date, exactMatch, stop) in
    let result = date
    // result = "Mar 30, 2018 at 4:00 AM"
    stop = true
}

另外,这是一个类似的问题:从二月开始时,Swift 的 Calendar.enumerateDates 给出了错误的结果


这似乎确实是一个应该向 Apple 报告的错误。确保您包含一个可运行的测试应用程序来演示该问题。Note该bug仅出现在iOS中。在 macOS(至少是 macOS 游乐场)中,代码按预期工作。

与此同时,有一个相当简单的解决方法。

更改您要使用的代码.forward代替.backward。这将给出下一个日期而不是上一个日期。似乎没有任何朝着这个方向发展的错误。然后使用:

Calendar.current.date(byAdding: .day, value: -1, date: result)

有一天回去就能得到你想要的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当使用 .backward 作为方向时,Calendar.nextDate() 的表现非常奇怪。仅适用于该月的最后一天 的相关文章

  • Vim 和 Mac:如何在不使用 pbcopy 的情况下复制到剪贴板

    我有一个同时支持剪贴板和 xterm clipboard 的 vim 版本 然而 y or y不要复制到系统剪贴板 我知道我可以使用 w pbcopy 甚至为其创建快捷方式 但我真的想要标准方式 我也看到了 fakeclip 但希望找到一个
  • 如何动态获取 UITableViewCell 的高度

    我创建了自定义的tableViewCell 我在UITableViewCell中添加了UIView SubView 所以我在 UIView 中的所有动态文本和图像内容都会根据文本和图像大小而变化 但现在 HeightforRowAtInde
  • 在 MAC OS X 10.9 上安装 NLTK 确实很困难

    我是 Python Mac OS 新手 我正在寻找 NLTK 教科书 但我在安装它时遇到了一些问题 我一直在寻找解决方案 但不幸的是 所有解决方案似乎都不适合我 或者我误解了如何使用它们 我遇到的基本问题是 尽管按照说明进行操作 NLTK
  • Swift:设置协议的可选属性

    如何设置协议的可选属性 例如 UITextInputTraits 有许多可选的读 写属性 当我尝试以下操作时 出现编译错误 无法分配给 textInputTraits 中的 keyboardType func initializeTextI
  • BigQuery 未显示链接的 Firebase Analytics 事件日志的任何数据集

    我将我的帐户链接到 Big Query 但 Firebase Analytics 事件不会自动加载到 BigQuery 中 显示 未找到数据集 警告 我的工作进度附在下面 请查收 I have getting firebase Analyt
  • $0 和 $1 在 Swift 闭包中意味着什么?

    let sortedNumbers numbers sort 0 gt 1 print sortedNumbers 谁能解释一下什么 0 and 1在斯威夫特中意味着什么 另一个样本 array forEach actions append
  • 使用数组中的字符串淡入/淡出标签

    func setOverlayTitle self overlayLogo text Welcome var hello String Bon Jour GUTEN nMORGEN BONJOUR HOLA BUENOS D AS BUON
  • 根据内容自动更改单元格高度 - Swift

    在 Swift 中使用 UITableView 有人可以帮我根据标签 图片和描述自动更改单元格的高度吗 所有信息都正确传递 我只需要帮助格式化它 我尝试使用调整它cell frame size height 但这没有效果 我可以更改故事板中
  • Xcode 异步单元测试在主线程上等待

    我正在尝试使用 Xcode 中的单元测试来测试一些异步代码 但主线程被阻塞 问题在于 某些正在测试的代码期望从 iOS 类 AVFoundation 接收回调 但是 AVFoundation 类似乎只会在主线程上回调 问题是 如果我正在进行
  • 从现有坐标地图套件中查找最近的位置

    我正在为拥有多家商店的客户开发 iPhone 应用程序 目标 C 我有数组中所有商店 20 的坐标 纬度 长 目前我正在考虑循环遍历商店坐标数组并获取从用户当前位置到商店位置的距离 然后将它们添加到数组中并按最小距离进行排序 这是正确的方法
  • 核心数据 iCloud 同步中的关系完整性和验证

    考虑以下简单的实体模型 实体 A 与实体 B 具有一对一关系 称为b 实体 B 具有逆对一关系 称为a 这两种关系都不是可选的 A B b lt gt a 假设我们有两个设备 1 和 2 开始完全同步 每个对象都有一个 A 类对象和一个 B
  • 使用输入类型 = 文件捕获照片时移动 safari 崩溃

    我正在使用输入类型文件在 iOS 中启动相机 我正在使用以下代码行
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • Mac 上的 Delphi - 可能吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我负责一个 Delphi Win32 项目管理应用程序 我刚刚完成了向 Delphi 2009 的迁移
  • 所有 RestKit 项目在归档时都无法构建

    这个问题涉及RESTKIT 0 9 x 如果您是 Restkit 新手 请考虑使用较新的版本0 10 x https github com RestKit RestKit tree v0 10 1 branch 我最近继承了一个项目 使用r
  • 在 Object 子类及其自己的子类上实现ignoreProperties()

    我是领域新手 我正在使用继承自 Object 的基类以及该基类的自定义子类创建模型 我的模型要求基类通过覆盖静态来声明一些属性被忽略ignoredProperties 方法 当尝试在某些基类子类上重写该方法时 我收到一个 Swift 编译器
  • 使用日期 Swift 3 对字典数组进行排序

    我有一个名为 myArray 的数组 其中添加了字典 我希望该字典按时间排序 这是字典中的键 那个时间是在 String 中 时间的日期格式为 yyyy MM dd HH mm ss 我尝试使用下面的代码解决方案 但给出了 从 字符串转换
  • 使用强光混合模式时突出显示伪影

    我正在 iPhone 应用程序中使用顶部图像的 HardLight 混合模式混合两个图像 它看起来像这样 UIGraphicsBeginImageContext size sourceImage drawInRect rectangle b
  • 上传存档错误:“缺少 iOS 发行版签名身份......”

    我正在尝试使用 Xcode 将我的 iOS 应用程序存档上传到 iTunes Connect 但是当我单击 上传到 App Store 时 出现错误 Xcode 尝试查找或生成匹配的签名资产并 由于以下问题未能做到这一点 缺少 iOS 为
  • 致命错误:在 Swift 中解包可选值时意外发现 nil

    所以我试图获取 Swift 中输入字段的文本 这就是我得到的 class ViewController UIViewController IBOutlet var passwordField UITextField IBOutlet var

随机推荐

  • 如何使用 php 将事件插入用户谷歌日历?

    我有以下代码可以插入到我的特定谷歌日历中 嗯 非常成功 但是如何让用户可以添加到自己的日历 有人可以帮助我 我的预期结果就像用户可以通过谷歌登录 这意味着用户可以添加到自己的谷歌日历 谢谢 添加到我的特定日历的代码 require once
  • 为什么 C++ 标准库不提供 cmath 函数的 constexpr 版本?

    We have constexpr自 C 11 以来 函数一直在使用 并且自每个新标准 14 1z 以来 它们的限制越来越少 然而 STL 中最明显的函数可以用constexpr the cmath math h功能 还是没有constex
  • Safari/WebKit 的 console.log DOM 节点作为对象?

    这件事让我抓狂了一段时间 当我 console log 一个 DOM 节点时 通过示例返回document getElementById 它显示为交互式 html 元素 就像它出现在 元素 选项卡上一样 这肯定很方便 但有时我只想能够扩展对
  • 我如何编写正则表达式“所有字符都相同”?

    我希望它匹配 aaaaaa bb c but not aaabaaa cd 假设正则表达式引擎支持反向引用 1 在Java中它会是 theString matches 1
  • 将 Tab 键顺序限制为单个用户控件 (WPF)

    目前我有一个带有自定义 UserControl 的 WPF 项目 该控件包含一个网格 其中包含多个表单类型元素 复选框 文本框 组合框等 该控件被设计为看起来像表单一样操作 但它被放置在拖动画布内 这就是为什么它需要是 UserContro
  • 如何“缓存” mongoDB/Mongoose 结果以在 Express.js 视图和路由中使用

    我想要实现的是某种方式缓存结果 of a mongoDB 猫鼬我可以在我的视图和路线中使用的查询 每当将新文档添加到集合中时 我都需要能够更新此缓存 由于函数是异步的 我不确定这是否可能 如果是 那么如何做到这一点 这是我目前用于存储画廊的
  • 外部链接到 Shiny App 中的特定 tabPanel

    可以相对轻松地在平面闪亮应用程序中使用锚链接 https stackoverflow com a 28605517 1659890 但是 外部链接是否可以针对特定的目标 tabPanel of a navbarPage在闪亮的应用程序中 考
  • Windows Phone 7 Mango 照片相机的取景器方向

    我将 PhotoCamera 控件与 Windows Phone 7 Mango Beta 2 开发工具结合使用 相机控件的 ViewFinder 是一个填充有 VideoBrush 的矩形对象 如下例所示 http msdn micros
  • Python Pandas 使用杰卡德相似度的距离矩阵

    我已经实现了一个使用杰卡德相似度构造距离矩阵的函数 import pandas as pd entries id 1 category1 100 category2 0 category3 100 id 2 category1 100 ca
  • 计算每行零的数量,并删除具有超过 n 个零的行

    我有一个关于计算每行零的问题 我有一个像这样的数据框 a c 1 2 3 4 5 6 0 2 5 b c 0 0 0 2 6 7 0 0 0 c c 0 5 2 7 3 1 0 3 0 d c 1 2 6 3 8 4 0 4 0 e c 0
  • 我迷路了。 ASP.NET MVC 5 发生了什么?

    我一直在埋头从事各种项目 显然微软一直在忙着做出一些重大改变 这让我很困惑 当我去年安装 Visual Studio 2017 并去创建一个新项目时 ASP NET Core 第一次出现在我的视野中 突然我可以选择 NET Framewor
  • flutter 中的闪屏实现

    我是 Flutter 新手 我想在我的应用程序中添加启动画面 我使用了 initState 和导航器 但这没有用 该应用程序打开时会出现初始屏幕 但之后它不会导航到下一个屏幕 我的 main dart import package flut
  • Java:学习基础网络的最佳起点 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在尝试用Java 编写一个简单的网络聊天程序 我几乎没有网络经验 我想知道我应该开始寻找哪些资源 当然除了这里 目前最好坚持使用核心 Java
  • 将文件上传到 S3 时选项请求被拒绝

    当我尝试将 JS 文件上传到 S3 时 出现上传错误 OptionsRequestDenied 除了这个之外 所有其他文件 包括 JS 文件 都可以工作 该文件使用 jQuery 发出一些跨域请求 如下所示 function corsReq
  • NodeJS Electron 与 Express

    我正在尝试使用 Electron 用于网站和桌面应用程序 和 Express 用于会话等 制作一个网络应用程序 现在 我将其作为我的 app js const express require express const app Browse
  • 使用不同的 sqlite 数据库结构将新版本更新到应用程序商店

    我已经在应用程序商店上传了一个应用程序 版本1 0 我的应用程序使用 sqlite 数据库来存储一些数据 现在 我对数据库进行了一些更改 我在数据库的一个表中添加了 2 或 3 个新列 我想用新版本 1 1 更新我的应用程序的先前版本 它具
  • Lambda 表达式未返回预期的 MemberInfo

    我遇到了一个我没有预料到的问题 一个例子可能比一段话更能说明我的问题 更新 跳到最后一个代码块以获得更雄辩的代码示例 public class A public string B get set public class C A 这是方法中
  • 如何在android中单击listview项目时从数据库获取id

    我在此网站上搜索了与此相关的各种问题 但无法解决我遇到的问题 我想通过单击列表视图项从数据库获取 id 这是我的类别类 package com example reminders import java util List import a
  • Django migrate --fake 和 --fake-initial 解释

    我使用 Django 已经大约两年了 有一个功能我一直害怕使用 伪造迁移 我几乎到处都查过 我能得到的最多信息来自文档其中指出 fake 告诉 Django 将迁移标记为已应用或 未应用 但没有实际运行 SQL 来更改您的 数据库架构 这是
  • 当使用 .backward 作为方向时,Calendar.nextDate() 的表现非常奇怪。仅适用于该月的最后一天

    在我的应用程序中 我需要获取之前的凌晨 4 点 而不是当前日期的凌晨 4 点 例如 if it s March 05 10 00 am那么我应该期待回来 March 05 4 00 am if it s March 05 02 00 am那