11

我想在两个日期之间生成一个随机日期——例如从今天到 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;
}
4

6 回答 6

17

获取一个随机数并将其用作时间间隔,然后将其添加到开始日期。例如

NSTimeInterval timeBetweenDates = [endDate timeIntervalSinceDate:startDate];
NSTimeInterval randomInterval = ((NSTimeInterval)arc4random() / ARC4RANDOM_MAX) * timeBetweenDates;

NSDate *randomDate = [startDate dateByAddingTimeInterval:randomInterval];
于 2012-04-10T16:22:30.457 回答
10
  1. 生成 1 到 60 之间的随机数

    int r = arc4random_uniform(60) + 1;
    
    // Usage : arc4random_uniform(hi - lo + 1) + lo
    
  2. 获取当前日期

    [NSDate date];
    
  3. 用于NSDateComponentsdays组件中减去随机数并生成新日期。

于 2012-04-10T16:21:23.420 回答
5

这里框架在生成随机日期方面做得很好。但在 Swift 中: 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)
    }

}
于 2015-10-12T09:02:23.237 回答
5

这是一个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
于 2018-08-26T04:20:31.940 回答
3

使用秒。伪代码:

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
于 2012-04-10T16:23:04.887 回答
0

斯威夫特 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)
    }
}

PS Esqarrouth回答更正了最新的 Swift。

于 2017-06-07T11:26:48.843 回答