Sök…
Syntax
- NSDate () // NSDate-objekt init till aktuellt datum och tid
- NSDate (). TimeIntervalSince1970 // Aktuellt datum och tid i antal sekunder från 00:00:00 UTC den 1 januari 1970.
- NSDate (). Jämför (annat: NSDate) // Returnerar en jämförelse av aktuellt datum till ett annat datum returnerar ett
NSComparisonResult
Anmärkningar
Det finns olika typer av datumformat som du kan ställa in: Här är en fullständig lista över dem.
Formatera | Betydelse / Beskrivning | Exempel 1 | example2 |
---|---|---|---|
y | Ett år med minst 1 siffra. | 175 e.Kr. → “175” | 2016 AD → “2016” |
yy | Ett år med exakt två siffror. | 5 AD → “05” | 2016 AD → “16” |
yyy | Ett år med minst 3 siffror. | 5 AD → “005” | 2016 AD → “2016” |
yyyy | Ett år med minst fyra siffror. | 5 e.Kr. → “0005” | 2016 AD → “2016” |
M | En månad med minst 1 siffra. | Juli → “7” | "November" → "11" |
MM | En månad med minst 2 siffror. | Juli → “07” | "November" → "11" |
MMM | Tre bokstavsmånaders förkortning. | Juli → “jul” | "November" → "nov" |
MMMM | Månadens fulla namn. | Juli → “juli” | "November" → "november" |
MMMMM | En bokstavsmånadförkortning (Jan, juni, juli kommer alla att ha 'J'). | Juli → “J” | "November" → "N" |
d | Dag med minst en siffra. | 8 → “8” | 29 → “29” |
dd | Dag med minst två siffror. | 8 → “08” | 29 → “29” |
"E", "EE" eller "EEE" | 3 bokstavsdag förkortning av dagnamn. | Måndag → “Man” | Torsdag → “Thu” |
EEEE | Hel dag namn. | Måndag → “Måndag” | Torsdag → “Torsdag” |
eeeee | 1 bokstavsdag förkortning av dagnamn. (Thu och Tue kommer att vara 'T') | Måndag → “M” | Torsdag → “T” |
eeeeee | 2 bokstavsdag förkortning av dagnamn. | Måndag → “Mo” | Torsdag → “Th” |
en | Dagstid (AM / PM). | 22.00 → “PM” | 02:00 → “AM” |
h | En 1-12 baserad timme med minst 1 siffra. | 22.00 → “10” | 02:00 → “2” |
hh | En 1-12 baserad timme med minst 2 siffror. | 22.00 → “10” | 02:00 → “02” |
H | En 0-23 baserad timme med minst 1 siffra. | 22.00 → “14” | 02:00 → “2” |
HH | En baserad timme på 0-23 med minst 2 siffror. | 22.00 → “14” | 02:00 → “02” |
m | En minut med minst 1 siffra. | 7 → “7” | 29 → “29” |
mm | En minut med minst 2 siffror. | 7 → “07” | 29 → “29” |
s | En sekund med minst 1 siffra. | 7 → “7” | 29 → “29” |
ss | En sekund med minst 2 siffror. | 7 → “07” | 29 → “29” |
Det finns många fler, för att få olika tid baserade på zon (z), för att få tid med millisekunddetaljer (S), etc.
Få aktuellt datum
Att få aktuellt datum är väldigt enkelt. Du får NSDate-objektet med det aktuella datumet på en enda rad enligt följande:
Snabb
var date = NSDate()
Snabb 3
var date = Date()
Objective-C
NSDate *date = [NSDate date];
Hämta NSDate-objekt N sekunder från aktuellt datum
Antalet sekunder från det aktuella datumet och tiden för det nya datumet. Använd ett negativt värde för att ange ett datum före det aktuella datumet.
För att göra detta har vi en metod som heter dateWithTimerIntervalSinceNow(seconds: NSTimeInterval) -> NSDate
(Swift) eller + (NSDate*)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds
(Objekt-C).
Om du till exempel behöver ett datum en vecka från aktuellt datum och en vecka till aktuellt datum, kan vi göra det som.
Snabb
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)
Snabb 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)
Objective-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);
Datumjämförelse
Det finns fyra metoder för att jämföra datum:
Snabb
-
isEqualToDate(anotherDate: NSDate) -> Bool
-
earlierDate(anotherDate: NSDate) -> NSDate
-
laterDate(anotherDate: NSDate) -> NSDate
-
compare(anotherDate: NSDate) -> NSComparisonResult
Objective-C
-
- (BOOL)isEqualToDate:(NSDate *)anotherDate
-
- (NSDate *)earlierDate:(NSDate *)anotherDate
-
- (NSDate *)laterDate:(NSDate *)anotherDate
-
- (NSComparisonResult)compare:(NSDate *)anotherDate
Låt oss säga att vi har två datum:
Snabb
let date1: NSDate = ... // initialized as July 7, 2016 00:00:00
let date2: NSDate = ... // initialized as July 2, 2016 00:00:00
Objective-C
NSDate *date1 = ... // initialized as July 7, 2016 00:00:00
NSDate *date2 = ... // initialized as July 2, 2016 00:00:00
Sedan, för att jämföra dem, försöker vi den här koden:
Snabb
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
}
Objective-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
}
Om du vill jämföra datum och hantera sekunder, veckor, månader och år:
Snabb 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")
Eller så kan du använda detta för varje komponent:
// 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
Få Unix Epoch-tid
För att få Unix Epoch Time använder du konstant timeIntervalSince1970
:
Snabb
let date = NSDate() // current date
let unixtime = date.timeIntervalSince1970
Objective-C
NSDate *date = [NSDate date]; // current date
int unixtime = [date timeIntervalSince1970];
NSDateFormatter
Att konvertera ett NSDate
objekt till sträng är bara NSDate
steg.
1. Skapa ett NSDateFormatter
objekt
Snabb
let dateFormatter = NSDateFormatter()
Snabb 3
let dateFormatter = DateFormatter()
Objective-C
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
2. Ställ in datumformatet som du vill ha din sträng i
Snabb
dateFormatter.dateFormat = "yyyy-MM-dd 'at' HH:mm"
Objective-C
dateFormatter.dateFormat = @"yyyy-MM-dd 'at' HH:mm";
3. Hämta den formaterade strängen
Snabb
let date = NSDate() // your NSDate object
let dateString = dateFormatter.stringFromDate(date)
Snabb 3
let date = Date() // your NSDate object
let dateString = dateFormatter.stringFromDate(date)
Objective-C
NSDate *date = [NSDate date]; // your NSDate object
NSString *dateString = [dateFormatter stringFromDate:date];
Detta ger utdata något så här: 2001-01-02 at 13:00
Notera
Att skapa en
NSDateFormatter
instans är en dyr operation, så det rekommenderas att skapa det en gång och återanvända när det är möjligt.
Användbar förlängning för att konvertera datum till sträng.
extension Date {
func toString() -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM dd yyyy"
return dateFormatter.string(from: self)
}
}
Användbara länkar för snabb datumformning snabbt-få-mänsklig-läsbar-datum-nsdateformatter .
För konstruktion av datumformat se datumformatmönster .
Konvertera NSDate som är sammansatt från timme och minut (endast) till en fullständig NSDate
Det finns många fall när man har skapat en NSDate från endast en timme- och minutformat, dvs: 08:12 som kommer tillbaka från en server som en sträng och du initierar en NSDate-instans endast med dessa värden.
Nackdelen med denna situation är att din NSDate är nästan helt "naken" och vad du behöver göra är att skapa: dag, månad, år, sekund och tidszon för att detta objekt ska "spela med" med andra NSDate-typer.
För exempelets skull låt oss säga att hourAndMinute är NSDate-typen som består av timme- och minutformat:
Objective-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 är ditt objekt den totala motsatsen till att vara "naken".
UTC Tidsförskjutning från NSDate med TimeZone
Här kommer detta att beräkna UTC
tidsförskjutningen från aktuell information i önskad tidszon.
+(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;
}
Få tidcykeltyp (12-timmars eller 24-timmars)
Kontrollera om det aktuella datumet innehåller symbolen för AM eller PM
Objective-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);
Begär tidscykeltypen från NSDateFormatter
Objective-C
NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
NSRange containsA = [formatStringForHours rangeOfString:@"a"];
BOOL is24h = containsA.location == NSNotFound;
Detta använder en speciell datummallsträng som heter "j" som enligt ICU Spec ...
[...] begär det föredragna timformatet för landskapet (h, H, K eller k), bestämt av det föredragna attributet för timmeelementet i kompletterande data. [...] Observera att användning av 'j' i ett skelett som skickas till ett API är det enda sättet att få ett skelett att begära ett landets önskade tidcykeltyp (12-timmars eller 24-timmars).
Den sista meningen är viktig. Det är "det enda sättet att få ett skelett att begära ett landets föredragna tidscykeltyp". Eftersom NSDateFormatter
och NSCalendar
är byggda på ICU-biblioteket, gäller det samma här.
Referens
Det andra alternativet härleddes från detta svar .
Hämta NSDate från JSON Datumformat "/ Date (1268123281843) /"
Före Json.NET 4,5 datum skrivdes med Microsoft-format: "/ Date (1198908717056) /". Om din server skickar datum i detta format kan du använda koden nedan för att serialisera den till NSDate:
Objective-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;
}
Få historisk tid från NSDate (t.ex.: 5s sedan, 2m sedan, 3h sedan)
Detta kan användas i olika chatapplikationer, RSS-flöden och sociala appar där du behöver ha senaste flöden med tidsstämplar:
Objective-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;
}