swift:如何为nsdate对象添加小时数(代码片段)

author author     2023-05-13     762

关键词:

我从string生成一个NSDate对象。

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT")
let stringToDate = dateFormatter.dateFromString(dateFromService) // 2015-07-20 12:00:43 +0000

我从网络服务器获取此字符串值。我需要修改个人设备时区。想要添加这个stringToDate对象的小时但不起作用

var addHours : Int = 2 // 2 hours will be added
var newDate = stringToDate.dateByAddingTimeInterval(addHours)
答案

你问的是错误的问题。这就是所谓的"XY Problem"。您应该询问“如何在用户的本地时区显示从Web服务器获取的日期字符串”。

NSDate以抽象形式表示不包含时区的日期/时间。您将其转换为特定时区进行显示。不要尝试向NSDate添加/减去小时以抵消时区。这是错误的做法。

正确的答案很简单。创建第二个日期格式化程序,不要将其时区设置为GMT。它默认为用户的本地时区。

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT")
let date = dateFormatter.dateFromString(dateFromService) 

let outputDatedateFormatter = NSDateFormatter()
outputDatedateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
//leave the time zone at the default (user's time zone)
let displayString = outputDateFormatter.stringFromDate(date)
println("Date in local time zone = (displayString)")
另一答案

使用NSCalendarComponents

let calendar = NSCalendar.currentCalendar()
let newDate = calendar.dateByAddingUnit(
    .CalendarUnitHour, // adding hours
    value: 2, // adding two hours
    toDate: oldDate,
    options: .allZeros
)

使用NSCalendar将解释闰秒,闰小等问题。

但正如Duncan C's answer指出的那样,简单地增加小时绝对是错误的做法。两个时区不会总是以相同的时间间隔分开。同样,当我们考虑夏令时时,尤其如此。 (例如,美国在与欧洲同一天没有开始/结束夏令时,亚利桑那州甚至没有夏令时)。

另一答案

对于Swift 3,您可以使用此功能:

//get next date by adding hours func  

getNewDateAfterAddingHours(hoursToAdd:NSInteger, oldDate:Date) -> Int64 
    let calendar = Calendar.current
    let newDate = calendar.date(byAdding: .hour, value: hoursToAdd, to: oldDate)
    return Int64((newDate?.timeIntervalSince1970)!)

另一答案

如果您经常这样做,请查看名为SwiftMoment的库(灵感来自相同的.js库),它允许您执行以下操作(以及更多!):

// Create date using moment library
let myDate = moment(myString)

// Add one hour
let dateWithAddedHour = myDate + 1.hours

Moment是NSDate实例的包装器,而Duration(这是从Int.hours,Int.minutes等获得的)包装NSTimeInterval值。

实现这一点应该只需要一点时间! (双关语)。

如何在 Swift 中从 NSDate 获取日、月和小时

】如何在Swift中从NSDate获取日、月和小时【英文标题】:Howtofetchday,monthandhourfromNSDateinSwift【发布时间】:2016-08-0510:05:55【问题描述】:我有一个名为reservationDate的NSDate对象,我想从日期中获取日、月和小时。但是,我得到了错误... 查看详情

如何为 Data swift 添加扩展?

】如何为Dataswift添加扩展?【英文标题】:HowtoaddextensionforDataswift?【发布时间】:2019-01-1013:37:28【问题描述】:我们正在使用GZIP压缩内存中的图像。它运行良好。问题是我们无法添加扩展名(.jpg用于数据)。怎么做?我将在下... 查看详情

iOS Swift如何为透明的UIView添加阴影

】iOSSwift如何为透明的UIView添加阴影【英文标题】:iOSSwifthowtoaddashadowtoatransparentUIView【发布时间】:2017-10-2203:51:58【问题描述】:我使用UIView作为带有阴影的叠加层,但是一旦我将UIView背景颜色设置为.clear,我就不再看到阴影,... 查看详情

iPhone OS:如何为特定日期创建 NSDate?

】iPhoneOS:如何为特定日期创建NSDate?【英文标题】:iPhoneOS:HowdoIcreateanNSDateforaspecificdate?【发布时间】:2010-04-0517:10:40【问题描述】:看起来很简单,但我似乎找不到方法。很高兴看到几种不同的方法。【问题讨论】:【参考方... 查看详情

如何为 Swift 3 创建第一个视图

】如何为Swift3创建第一个视图【英文标题】:howtocreateveryfirstviewforSwift3【发布时间】:2017-06-2207:02:11【问题描述】:您好,我制作了一个ViewController。但我不知道如何在点击应用后立即添加第一个视图。我在ViewController.swift中添... 查看详情

如何为 UILocalNotification 设置 NSDate

】如何为UILocalNotification设置NSDate【英文标题】:HowtosetNSDateforUILocalNotifiication【发布时间】:2016-02-0714:27:33【问题描述】:我的事件日期输出正确,我的页面没有错误,但我的应用程序崩溃了,请帮忙?我相信这可能与将我的NSSt... 查看详情

如何为 Swift UI 的字符添加最大长度

】如何为SwiftUI的字符添加最大长度【英文标题】:HowtoAddMaxlengthforacharacterforSwiftUI【发布时间】:2019-10-1309:20:39【问题描述】:您好,我正在创建一个待办事项应用程序,当用户在UIText字段中输入一些字符时遇到问题,我记得SWIF... 查看详情

Swift 如何为使用 Firebase 投票的用户添加 5 星评分

】Swift如何为使用Firebase投票的用户添加5星评分【英文标题】:Swifthowtoadd5starratingsforuserstovoteusingFirebase【发布时间】:2018-08-2520:18:59【问题描述】:我正在Swift中创建一个餐厅评级应用程序,它允许其用户以5星评级标准对餐厅进... 查看详情

如何为对象计数多个关系创建谓词?核心数据 iOS Swift

】如何为对象计数多个关系创建谓词?核心数据iOSSwift【英文标题】:HowTocreatepredicateforobjectcountseveralrelationshipsdeep?CoreDataiOSSwift【发布时间】:2014-09-1118:29:16【问题描述】:我有一个相当棘手的问题,我还没有找到答案,希望您... 查看详情

如何为自定义对象的 ArrayList 添加 parcelable 实现?

】如何为自定义对象的ArrayList添加parcelable实现?【英文标题】:HowtoaddtheparcelableimplementationforArrayListofCustomobject?【发布时间】:2021-12-0202:02:55【问题描述】:我创建了一个包含自定义对象的ArrayList和一些其他字符串变量的类。我... 查看详情

如何为自定义 UIControl 添加触摸事件并在 swift 5 中确定触摸的项目

】如何为自定义UIControl添加触摸事件并在swift5中确定触摸的项目【英文标题】:HowtoaddtoucheventforcustomUIControlanddeterminethetouchediteminswift5【发布时间】:2019-08-2119:15:18【问题描述】:我创建了一个自定义UIControl。UIControl包含多个项... 查看详情

通过 NSDate 对象属性进行 Swift 过滤

】通过NSDate对象属性进行Swift过滤【英文标题】:SwiftfilterbyNSDateobjectproperty【发布时间】:2015-03-1709:51:49【问题描述】:我想用日期属性过滤我的自定义对象。例如:classEventletdateFrom:NSDate!letdateTo:NSDate!init(dateFrom:NSDate,dateTo:NSDate)s... 查看详情

如何为具有不同数量的键/值对的对象添加类型?[关闭](代码片段)

我的API返回一个对象,该对象具有数据库表中每个特定实体的键/值对。例如,如果它是配方应用程序,则键将是配方ID,值将是配方名称。因此,在编译时未知密钥/值对的数量。客户端是用Typescript编写的,需要安全的打字。当... 查看详情

如何为蒸汽添加新的依赖项?

】如何为蒸汽添加新的依赖项?【英文标题】:howtoaddanewdependencytovapor?【发布时间】:2021-12-3112:53:45【问题描述】:我想向vapor中添加一个新的依赖项,但出现此错误-目标“App”的依赖项中的未知包“Web3”;有效的包是:\'vapor\... 查看详情

如何为倒数计时器添加格式时/分/秒

】如何为倒数计时器添加格式时/分/秒【英文标题】:Howaddformathours/minutes/secondsForCountdowntimer【发布时间】:2015-12-0809:34:06【问题描述】:我对计时器倒计时感到困惑,我试图改变但坚持小时格式,我从链接中得到如下代码倒计... 查看详情

如何为 Swift 转换 MONActivityView 方法

】如何为Swift转换MONActivityView方法【英文标题】:HowtoconvertMONActivityViewMethodforSwift【发布时间】:2016-04-1504:54:31【问题描述】:我正在尝试使用用Obj-C编写的自定义ActivityIndi​​catorView。它包含在UIView框架中居中指示器所需的方法... 查看详情

Swift:如何为 CALayer 启用捏合缩放功能?

】Swift:如何为CALayer启用捏合缩放功能?【英文标题】:Swift:Howtoenablepinch-to-zoomforCALayer?【发布时间】:2015-08-2502:52:48【问题描述】:我一直在尝试滚动和缩放多个多边形路径的CALayer,特别是CAShapeLayer。我将CALayer添加到UIScrollVie... 查看详情

nsdate和nsdateformatter(代码片段)

定义一个当前日期的NSDate对象NSDate*currentDate=[NSDatedate];NSDate常用方法以已有NSDate对象实例为基准,定义一个表示一小时后的NSDate对象:[NSDatedateWithTimeInterval:3600sinceDate:currentDate]->NSDate以下统一写成消息闭包的形式,单位默认为... 查看详情