Zoeken…


Syntaxis

  • NSDate () // NSDate-object init tot de huidige datum en tijd
  • NSDate (). TimeIntervalSince1970 // Huidige datum en tijd in aantal seconden vanaf 00:00:00 UTC op 1 januari 1970.
  • NSDate (). Compare (other: NSDate) // Retourneert een vergelijking van de huidige datum met een andere datum retourneert een NSComparisonResult

Opmerkingen

Er zijn verschillende soorten datumnotaties die u kunt instellen: Hier is de volledige lijst.

Formaat Betekenis / Beschrijving Voorbeeld 1 example2
Y Een jaar met minimaal 1 cijfer. 175 AD → “175” 2016 AD → “2016”
yy Een jaar met precies 2 cijfers. 5 AD → “05” 2016 AD → “16”
yyy Een jaar met minimaal 3 cijfers. 5 AD → “005” 2016 AD → “2016”
yyyy Een jaar met minimaal 4 cijfers. 5 AD → “0005” 2016 AD → “2016”
M Een maand met minimaal 1 cijfer. Juli → '7' "November" → "11"
MM Een maand met minimaal 2 cijfers. Juli → '07' "November" → "11"
MMM Afkorting van drie letters. Juli → 'Jul' "November" → "Nov"
MMMM Volledige naam van de maand. Juli → 'Juli' "November" → "November"
MMMMM Afkorting van één lettermaand (januari, juni, juli hebben allemaal 'J'). Juli → 'J' "November" → "N"
d Dag met ten minste één cijfer. 8 → “8” 29 → '29'
dd Dag met minimaal twee cijfers. 8 → '08' 29 → '29'
"E", "EE" of "EEE" 3 letter dag afkorting van dagnaam. Maandag → 'ma' Donderdag → 'do'
EEEE Volledige dagnaam. Maandag → "maandag" Donderdag → "donderdag"
EEEEE 1 letter dag afkorting van dagnaam. (Do en di zijn 'T') Maandag → "M" Donderdag → "T"
EEEEEE 2 letter dag afkorting van dagnaam. Maandag → “Mo” Donderdag → "Th"
een Periode van de dag (AM / PM). 22 PM → "PM" 2 AM → “AM”
h Een op 1-12 gebaseerd uur met minimaal 1 cijfer. 22 PM → "10" 2 AM → “2”
hh Een op 1-12 gebaseerd uur met minimaal 2 cijfers. 22 PM → "10" 2 AM → '02'
H Een op 0-23 gebaseerd uur met minimaal 1 cijfer. 22 PM → “14” 2 AM → “2”
HH Een op 0-23 gebaseerd uur met minimaal 2 cijfers. 22 PM → “14” 2 AM → '02'
m Een minuut met minimaal 1 cijfer. 7 → “7” 29 → '29'
mm Een minuut met minimaal 2 cijfers. 7 → '07' 29 → '29'
s Een seconde met minimaal 1 cijfer. 7 → “7” 29 → '29'
ss Een seconde met minimaal 2 cijfers. 7 → '07' 29 → '29'

Er zijn er nog veel meer, om verschillende tijd te krijgen op basis van zone (z), om tijd te krijgen met milliseconde details (S), etc.

Krijg huidige datum

De huidige datum ophalen is heel eenvoudig. U krijgt het NSDate-object van de huidige datum als volgt in slechts één regel:

Snel

var date = NSDate()

Swift 3

var date = Date()

Doelstelling C

NSDate *date = [NSDate date];

Krijg NSDate Object N seconden vanaf de huidige datum

Het aantal seconden vanaf de huidige datum en tijd voor de nieuwe datum. Gebruik een negatieve waarde om een datum voor de huidige datum op te geven.

Hiervoor hebben we een methode met de naam dateWithTimerIntervalSinceNow(seconds: NSTimeInterval) -> NSDate (Swift) of + (NSDate*)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds (Objective-C).

Als u nu bijvoorbeeld een datum nodig hebt, één week vanaf de huidige datum en één week tot de huidige datum, kunnen we dat als volgt doen.

Snel

let totalSecondsInWeek:NSTimeInterval = 7 * 24 * 60 * 60;
//Using negative value for previous date from today
let nextWeek = NSDate().dateWithTimerIntervalSinceNow(totalSecondsInWeek)

//Using positive value for future date from today
let lastWeek = NSDate().dateWithTimerIntervalSinceNow(-totalSecondsInWeek)

Swift 3

let totalSecondsInWeek:TimeInterval = 7 * 24 * 60 * 60;

//Using positive value to add to the current date
let nextWeek = Date(timeIntervalSinceNow: totalSecondsInWeek)

//Using negative value to get date one week from current date
let lastWeek = Date(timeIntervalSinceNow: -totalSecondsInWeek)

Doelstelling C

NSTimeInterval totalSecondsInWeek = 7 * 24 * 60 * 60;
//Using negative value for previous date from today
NSDate *lastWeek = [NSDate dateWithTimeIntervalSinceNow:-totalSecondsInWeek];

//Using positive value for future date from today
NSDate *nextWeek = [NSDate dateWithTimeIntervalSinceNow:totalSecondsInWeek];

NSLog(@"Last Week: %@", lastWeek);
NSLog(@"Right Now: %@", now);
NSLog(@"Next Week: %@", nextWeek);

Datum vergelijking

Er zijn 4 methoden om datums te vergelijken:

Snel

  • isEqualToDate(anotherDate: NSDate) -> Bool
  • earlierDate(anotherDate: NSDate) -> NSDate
  • laterDate(anotherDate: NSDate) -> NSDate
  • compare(anotherDate: NSDate) -> NSComparisonResult

Doelstelling C

  • - (BOOL)isEqualToDate:(NSDate *)anotherDate
  • - (NSDate *)earlierDate:(NSDate *)anotherDate
  • - (NSDate *)laterDate:(NSDate *)anotherDate
  • - (NSComparisonResult)compare:(NSDate *)anotherDate

Laten we zeggen dat we 2 datums hebben:

Snel

let date1: NSDate = ... // initialized as  July 7, 2016 00:00:00
let date2: NSDate = ... // initialized as  July 2, 2016 00:00:00

Doelstelling C

NSDate *date1 = ... // initialized as  July 7, 2016 00:00:00
NSDate *date2 = ... // initialized as  July 2, 2016 00:00:00

Vervolgens proberen we deze code om ze te vergelijken:

Snel

if date1.isEqualToDate(date2) {
    // returns false, as both dates aren't equal
}

earlierDate: NSDate = date1.earlierDate(date2) // returns the earlier date of the two (date 2)
laterDate: NSDate = date1.laterDate(date2) // returns the later date of the two (date1)

result: NSComparisonResult = date1.compare(date2)

if result == .OrderedAscending {
    // true if date1 is earlier than date2
} else if result == .OrderedSame {
    // true if the dates are the same
} else if result == .OrderedDescending {
    // true if date1 is later than date1
}

Doelstelling C

if ([date1 isEqualToDate:date2]) {
    // returns false, as both date are not equal
}

NSDate *earlierDate = [date1 earlierDate:date2]; // returns date which comes earlier from both date, here it will return date2
NSDate *laterDate = [date1 laterDate:date2]; // returns date which comes later from both date, here it will return date1

NSComparisonResult result = [date1 compare:date2];
if (result == NSOrderedAscending) {
    // fails
    // comes here if date1 is earlier then date2, in our case it will not come here
} else if (result == NSOrderedSame){
    // fails
    // comes here if date1 is same as date2, in our case it will not come here
} else{ // NSOrderedDescending
    // succeeds
    // comes here if date1 is later than date2, in our case it will come here
}

Als u datums wilt vergelijken en seconden, weken, maanden en jaren wilt verwerken:

Swift 3

let dateStringUTC = "2016-10-22 12:37:48 +0000"
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss X"
let date = dateFormatter.date(from: dateStringUTC)!

let now = Date()

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.maximumUnitCount = 2
let string = formatter.string(from: date, to: Date())! + " " + NSLocalizedString("ago", comment: "added after elapsed time to say how long before")

Of u kunt dit voor elke component gebruiken:

// get the current date and time
let currentDateTime = Date()

// get the user's calendar
let userCalendar = Calendar.current

// choose which date and time components are needed
let requestedComponents: Set<Calendar.Component> = [
    .year,
    .month,
    .day,
    .hour,
    .minute,
    .second
]

// get the components
let dateTimeComponents = userCalendar.dateComponents(requestedComponents, from: currentDateTime)

// now the components are available
dateTimeComponents.year 
dateTimeComponents.month 
dateTimeComponents.day  
dateTimeComponents.hour 
dateTimeComponents.minute
dateTimeComponents.second

Ontvang Unix Epoch-tijd

Gebruik de constante timeIntervalSince1970 om Unix Epoch Time te krijgen:

Snel

let date = NSDate() // current date
let unixtime = date.timeIntervalSince1970

Doelstelling C

NSDate *date = [NSDate date]; // current date
int unixtime = [date timeIntervalSince1970];

NSDateFormatter

Het omzetten van een NSDate object naar tekenreeks is slechts 3 stappen.

1. Maak een NSDateFormatter object

Snel

let dateFormatter = NSDateFormatter()

Swift 3

let dateFormatter = DateFormatter()

Doelstelling C

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

2. Stel de datumnotatie in waarin u uw string wilt

Snel

dateFormatter.dateFormat = "yyyy-MM-dd 'at' HH:mm"

Doelstelling C

dateFormatter.dateFormat = @"yyyy-MM-dd 'at' HH:mm";

3. Haal de opgemaakte string op

Snel

let date = NSDate() // your NSDate object
let dateString = dateFormatter.stringFromDate(date)

Swift 3

let date = Date() // your NSDate object
let dateString = dateFormatter.stringFromDate(date)

Doelstelling C

NSDate *date = [NSDate date]; // your NSDate object
NSString *dateString = [dateFormatter stringFromDate:date];

Dit geeft de output zoiets als dit: 2001-01-02 at 13:00

Notitie

Het maken van een NSDateFormatter instantie is een dure bewerking, dus het wordt aanbevolen om deze eenmaal te maken en indien mogelijk opnieuw te gebruiken.

Handige extensie voor het converteren van datum naar tekenreeks.

extension Date {
        func toString() -> String {
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "MMMM dd yyyy"
            return dateFormatter.string(from: self)
        }
}

Handige links voor snelle datum-vorming snel-krijgen-mens-leesbaar-datum-nsdateformatter .

Voor de bouw van datumindelingen zien datumnotatie patronen .

Converteer NSDate die is samengesteld uit uur en minuut (alleen) naar een volledige NSDate

Er zijn veel gevallen waarin iemand een NSDate heeft gemaakt op basis van alleen een uur- en minutennotatie, bijvoorbeeld: 08:12 die terugkeert van een server als een tekenreeks en u een NSDate-instantie alleen met deze waarden initieert .

Het nadeel voor deze situatie is dat uw NSDate bijna helemaal "naakt" is en wat u moet doen is het creëren van: dag, maand, jaar, tweede en tijdzone om dit object te "meespelen" met andere NSDate-types.

Laten we voor het voorbeeld zeggen dat hourAndMinute het type NSDate is dat is samengesteld uit uren- en minutennotatie:

Doelstelling C

NSDateComponents *hourAndMinuteComponents = [calendar components:NSCalendarUnitHour | NSCalendarUnitMinute
                                                         fromDate:hourAndMinute];
NSDateComponents *componentsOfDate = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear
                                                                     fromDate:[NSDate date]];

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay: componentsOfDate.day];
[components setMonth: componentsOfDate.month];
[components setYear: componentsOfDate.year];
[components setHour: [hourAndMinuteComponents hour]];
[components setMinute: [hourAndMinuteComponents minute]];
[components setSecond: 0];
[calendar setTimeZone: [NSTimeZone defaultTimeZone]];

NSDate *yourFullNSDateObject = [calendar dateFromComponents:components];

Nu is je object het tegenovergestelde van 'naakt' zijn.

UTC-tijdverschuiving van NSDate met TimeZone

Hier wordt de UTC tijdverschuiving berekend van de huidige gegevens in de gewenste tijdzone.

+(NSTimeInterval)getUTCOffSetIntervalWithCurrentTimeZone:(NSTimeZone *)current forDate:(NSDate *)date  {
    NSTimeZone *utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
    NSInteger currentGMTOffset = [current secondsFromGMTForDate:date];
    NSInteger gmtOffset = [utcTimeZone secondsFromGMTForDate:date];
    NSTimeInterval gmtInterval = currentGMTOffset - gmtOffset;
    return gmtInterval;
}

Type tijdcyclus (12 uur of 24 uur)

Controleren of de huidige datum het symbool voor AM of PM bevat

Doelstelling C

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
NSString *dateString = [formatter stringFromDate:[NSDate date]];
NSRange amRange = [dateString rangeOfString:[formatter AMSymbol]];
NSRange pmRange = [dateString rangeOfString:[formatter PMSymbol]];
BOOL is24h = (amRange.location == NSNotFound && pmRange.location == NSNotFound);

Het type NSDateFormatter aanvragen bij NSDateFormatter

Doelstelling C

NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
NSRange containsA = [formatStringForHours rangeOfString:@"a"];
BOOL is24h = containsA.location == NSNotFound;

Dit maakt gebruik van een speciale datum sjabloon string genaamd "j" die volgens de ICU Spec ...

[...] vraagt om het gewenste uurformaat voor de landinstelling (h, H, K of k), zoals bepaald door het voorkeursattribuut van het urenelement in aanvullende gegevens. [...] Merk op dat het gebruik van 'j' in een skelet dat aan een API wordt doorgegeven, de enige manier is om een skelet het gewenste type tijdcyclus van de locatie (12 uur of 24 uur) te laten aanvragen.

Die laatste zin is belangrijk. Het "is de enige manier om een skelet het tijdtype van de voorkeur van de locale te laten aanvragen". Aangezien NSDateFormatter en NSCalendar op de ICU-bibliotheek zijn gebouwd, geldt hier hetzelfde.

Referentie

De tweede optie is afgeleid van dit antwoord .

NSDate ophalen van JSON Datumnotatie "/ Date (1268123281843) /"

Voorafgaand aan Json.NET werden 4.5 datums geschreven in de Microsoft-indeling: "/ Date (1198908717056) /". Als uw server datum in dit formaat verzendt, kunt u de onderstaande code gebruiken om deze naar NSDate te serialiseren:

Doelstelling C

(NSDate*) getDateFromJSON:(NSString *)dateString
{
    // Expect date in this format "/Date(1268123281843)/"
    int startPos = [dateString rangeOfString:@"("].location+1;
    int endPos = [dateString rangeOfString:@")"].location;
    NSRange range = NSMakeRange(startPos,endPos-startPos);
    unsigned long long milliseconds = [[dateString substringWithRange:range] longLongValue];
    NSLog(@"%llu",milliseconds);
    NSTimeInterval interval = milliseconds/1000;
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:interval];
    // add code for date formatter if need NSDate in specific format.
    return date;
}

Krijg historische tijd van NSDate (bijv .: 5s geleden, 2m geleden, 3h geleden)

Dit kan worden gebruikt in verschillende chattoepassingen, RSS-feeds en sociale apps waar u de nieuwste feeds met tijdstempels nodig hebt:

Doelstelling C

- (NSString *)getHistoricTimeText:(NSDate *)since
{
    NSString *str;
    NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:since];
    if(interval < 60)
        str = [NSString stringWithFormat:@"%is ago",(int)interval];
    else if(interval < 3600)
    {
        int minutes = interval/60;
        str = [NSString stringWithFormat:@"%im ago",minutes];
    }
    else if(interval < 86400)
    {
        int hours =  interval/3600;
        
        str = [NSString stringWithFormat:@"%ih ago",hours];
    }
    else
    {
        NSDateFormatter *dateFormater=[[NSDateFormatter alloc]init];
        [dateFormater setLocale:[NSLocale currentLocale]];
        NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:@"MMM d, YYYY" options:0 locale:[NSLocale currentLocale]];
        [dateFormater setDateFormat:dateFormat];
        str = [dateFormater stringFromDate:since];
        
    }
    return str;
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow