我想在两个日期之间生成一个随机日期 - 例如从今天到现在60天之间的随机日期。我该怎么做?
更新
使用答案中的信息,我想出了这种方法,我经常使用它:
// Generate a random date sometime between now and n days before day.
// Also, generate a random time to go with the day while we are at it.
- (NSDate *) generateRandomDateWithinDaysBeforeToday:(NSInteger)days
{
int r1 = arc4random_uniform(days);
int r2 = arc4random_uniform(23);
int r3 = arc4random_uniform(59);
NSDate *today = [NSDate new];
NSCalendar *gregorian =
[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *offsetComponents = [NSDateComponents new];
[offsetComponents setDay:(r1*-1)];
[offsetComponents setHour:r2];
[offsetComponents setMinute:r3];
NSDate *rndDate1 = [gregorian dateByAddingComponents:offsetComponents
toDate:today options:0];
return rndDate1;
}
答案 0 :(得分:17)
获取一个随机数并将其用作时间间隔,然后将其添加到开始日期。 E.g。
NSTimeInterval timeBetweenDates = [endDate timeIntervalSinceDate:startDate];
NSTimeInterval randomInterval = ((NSTimeInterval)arc4random() / ARC4RANDOM_MAX) * timeBetweenDates;
NSDate *randomDate = [startDate dateByAddingTimeInterval:randomInterval];
答案 1 :(得分:10)
生成1到60之间的随机数
int r = arc4random_uniform(60) + 1;
// Usage : arc4random_uniform(hi - lo + 1) + lo
获取当前日期
[NSDate date];
使用NSDateComponents
从days
组件中减去随机数并生成新日期。
答案 2 :(得分:5)
这里框架在生成随机日期方面做得很好。但在斯威夫特: https://github.com/thellimist/SwiftRandom/blob/master/SwiftRandom/Randoms.swift
public extension NSDate {
/// SwiftRandom extension
public static func randomWithinDaysBeforeToday(days: Int) -> NSDate {
let today = NSDate()
guard let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) else {
print("no calendar \"NSCalendarIdentifierGregorian\" found")
return today
}
let r1 = arc4random_uniform(UInt32(days))
let r2 = arc4random_uniform(UInt32(23))
let r3 = arc4random_uniform(UInt32(23))
let r4 = arc4random_uniform(UInt32(23))
let offsetComponents = NSDateComponents()
offsetComponents.day = Int(r1) * -1
offsetComponents.hour = Int(r2)
offsetComponents.minute = Int(r3)
offsetComponents.second = Int(r4)
guard let rndDate1 = gregorian.dateByAddingComponents(offsetComponents, toDate: today, options: []) else {
print("randoming failed")
return today
}
return rndDate1
}
/// SwiftRandom extension
public static func random() -> NSDate {
let randomTime = NSTimeInterval(arc4random_uniform(UInt32.max))
return NSDate(timeIntervalSince1970: randomTime)
}
}
答案 3 :(得分:3)
这是 Swift 4.x 扩展名,它允许您指定几天的时间,然后使用该天数来查找当前日期之前或之后的随机Date
extension Date {
static func randomDate(range: Int) -> Date {
// Get the interval for the current date
let interval = Date().timeIntervalSince1970
// There are 86,400 milliseconds in a day (ignoring leap dates)
// Multiply the 86,400 milliseconds against the valid range of days
let intervalRange = Double(86_400 * range)
// Select a random point within the interval range
let random = Double(arc4random_uniform(UInt32(intervalRange)) + 1)
// Since this can either be in the past or future, we shift the range
// so that the halfway point is the present
let newInterval = interval + (random - (intervalRange / 2.0))
// Initialize a date value with our newly created interval
return Date(timeIntervalSince1970: newInterval)
}
}
您这样称呼它:
Date.randomDate(range: 500) // Any date that is +/- 500 days from the current date
运行10次会产生:
2019-03-15 01:45:52 +0000
2018-12-20 02:09:51 +0000
2018-06-28 10:28:31 +0000
2018-08-02 08:13:01 +0000
2019-01-25 07:04:18 +0000
2018-08-30 22:37:52 +0000
2018-10-05 19:38:22 +0000
2018-11-30 04:51:18 +0000
2019-03-24 07:27:39 +0000
答案 4 :(得分:2)
使用秒。伪代码:
1 Generate a random integer between 0 and (60 * 60 * 24 * 60)
2 Get the unixtime in seconds for the current time
3 Add your random integer
4 Convert this integer back to a date
答案 5 :(得分:0)
Swift 3.x +
public extension Date {
/// SwiftRandom extension
public static func randomWithinDaysBeforeToday(days: Int) -> Date {
let today = Date()
let gregorian = Calendar(identifier: .gregorian)
let r1 = arc4random_uniform(UInt32(days))
let r2 = arc4random_uniform(UInt32(23))
let r3 = arc4random_uniform(UInt32(23))
let r4 = arc4random_uniform(UInt32(23))
let offsetComponents = NSDateComponents()
offsetComponents.day = Int(r1) * -1
offsetComponents.hour = Int(r2)
offsetComponents.minute = Int(r3)
offsetComponents.second = Int(r4)
let rndDate1 = gregorian.date(byAdding: offsetComponents as DateComponents, to: today)
return rndDate1!
}
/// SwiftRandom extension
public static func random() -> Date {
let randomTime = TimeInterval(arc4random_uniform(UInt32.max))
return Date(timeIntervalSince1970: randomTime)
}
}
<子> P.S。 Esqarrouth answer已针对最新的Swift进行了更正。 子>