Buscar..
Sintaxis
- NSDate () // NSDate object init a la fecha y hora actuales
- NSDate (). TimeIntervalSince1970 // Fecha y hora actuales en número de segundos desde las 00:00:00 UTC del 1 de enero de 1970.
- NSDate (). Compare (other: NSDate) // Devuelve una comparación de la fecha actual con otra fecha devuelve un
NSComparisonResult
Observaciones
Hay diferentes tipos de formato de fecha que puede establecer: Aquí está la lista completa de ellos.
Formato | Significado / Descripción | Ejemplo 1 | Ejemplo 2 |
---|---|---|---|
y | Un año con al menos 1 dígito. | 175 dC → “175” | 2016 DC → “2016” |
yy | Un año con exactamente 2 dígitos. | 5 dC → “05” | 2016 DC → “16” |
yyy | Un año con al menos 3 dígitos. | 5 dC → “005” | 2016 DC → “2016” |
aaaa | Un año con al menos 4 dígitos. | 5 dC → “0005” | 2016 DC → “2016” |
METRO | Un mes con al menos 1 dígito. | Julio → “7” | "Noviembre" → "11" |
MM | Un mes con al menos 2 dígitos. | Julio → “07” | "Noviembre" → "11" |
MMM | Abreviatura de tres letras del mes. | Julio → “Julio” | "Noviembre" → "noviembre" |
MMMM | Nombre completo del mes. | Julio → “Julio” | "Noviembre" → "Noviembre" |
MMMMM | Una abreviatura de un mes (enero, junio, julio, todos tendrán 'J'). | Julio → “J” | "Noviembre" → "N" |
re | Día con al menos un dígito. | 8 → “8” | 29 → “29” |
dd | Día con al menos dos dígitos. | 8 → “08” | 29 → “29” |
"E", "EE" o "EEE" | Abreviatura de día de 3 letras del nombre del día. | Lunes → "lun" | Jueves → “Jue” |
EEEE | Nombre del día completo. | Lunes → "lunes" | Jueves → “jueves” |
EEEEE | Abreviatura de un día de una letra del nombre del día. (Thu y Tue serán 'T') | Lunes → "M" | Jueves → “T” |
EEEEEE | Abreviatura de 2 letras del nombre del día. | Lunes → "Mo" | Jueves → "th" |
una | Período del día (AM / PM). | 10 PM → "PM" | 2 AM → "AM" |
h | Una hora basada en 1-12 con al menos 1 dígito. | 10 PM → “10” | 2 AM → “2” |
S.S | Una hora basada en 1-12 con al menos 2 dígitos. | 10 PM → “10” | 2 a.m. → “02” |
H | Una hora basada en 0-23 con al menos 1 dígito. | 10 p.m. → “14” | 2 AM → “2” |
S.S | Una hora basada en 0-23 con al menos 2 dígitos. | 10 p.m. → “14” | 2 a.m. → “02” |
metro | Un minuto con al menos 1 dígito. | 7 → “7” | 29 → “29” |
mm | Un minuto con al menos 2 dígitos. | 7 → “07” | 29 → “29” |
s | Un segundo con al menos 1 dígito. | 7 → “7” | 29 → “29” |
ss | Un segundo con al menos 2 dígitos. | 7 → “07” | 29 → “29” |
Hay muchos más, para obtener un tiempo diferente según la zona (z), para obtener el tiempo con detalles de milisegundos (S), etc.
Obtener fecha actual
Obtener la fecha actual es muy fácil. Obtendrá el objeto NSDate de la fecha actual en una sola línea de la siguiente manera:
Rápido
var date = NSDate()
Swift 3
var date = Date()
C objetivo
NSDate *date = [NSDate date];
Obtenga NSDate Object N segundos desde la fecha actual
El número de segundos a partir de la fecha y hora actuales para la nueva fecha. Use un valor negativo para especificar una fecha antes de la fecha actual.
Para hacer esto tenemos un método llamado dateWithTimerIntervalSinceNow(seconds: NSTimeInterval) -> NSDate
(Swift) o + (NSDate*)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds
(Objective-C).
Ahora, por ejemplo, si necesita una fecha de una semana desde la fecha actual y una semana hasta la fecha actual, entonces podemos hacerlo como.
Rápido
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)
C objetivo
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);
Comparación de fechas
Hay 4 métodos para comparar fechas:
Rápido
-
isEqualToDate(anotherDate: NSDate) -> Bool
-
earlierDate(anotherDate: NSDate) -> NSDate
-
laterDate(anotherDate: NSDate) -> NSDate
-
compare(anotherDate: NSDate) -> NSComparisonResult
C objetivo
-
- (BOOL)isEqualToDate:(NSDate *)anotherDate
-
- (NSDate *)earlierDate:(NSDate *)anotherDate
-
- (NSDate *)laterDate:(NSDate *)anotherDate
-
- (NSComparisonResult)compare:(NSDate *)anotherDate
Digamos que tenemos 2 fechas:
Rápido
let date1: NSDate = ... // initialized as July 7, 2016 00:00:00
let date2: NSDate = ... // initialized as July 2, 2016 00:00:00
C objetivo
NSDate *date1 = ... // initialized as July 7, 2016 00:00:00
NSDate *date2 = ... // initialized as July 2, 2016 00:00:00
Luego, para compararlos, probamos este código:
Rápido
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
}
C objetivo
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
}
Si desea comparar fechas y manejar segundos, semanas, meses y años:
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")
O puedes usar esto para cada componente:
// 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
Obtener tiempo de época de Unix
Para obtener Unix Epoch Time , use la constante timeIntervalSince1970
:
Rápido
let date = NSDate() // current date
let unixtime = date.timeIntervalSince1970
C objetivo
NSDate *date = [NSDate date]; // current date
int unixtime = [date timeIntervalSince1970];
NSDateFormatter
Convertir un objeto NSDate
en cadena es solo 3 pasos.
1. Crea un objeto NSDateFormatter
Rápido
let dateFormatter = NSDateFormatter()
Swift 3
let dateFormatter = DateFormatter()
C objetivo
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
2. Establece el formato de fecha en el que quieres tu cadena
Rápido
dateFormatter.dateFormat = "yyyy-MM-dd 'at' HH:mm"
C objetivo
dateFormatter.dateFormat = @"yyyy-MM-dd 'at' HH:mm";
3. Obtener la cadena con formato
Rápido
let date = NSDate() // your NSDate object
let dateString = dateFormatter.stringFromDate(date)
Swift 3
let date = Date() // your NSDate object
let dateString = dateFormatter.stringFromDate(date)
C objetivo
NSDate *date = [NSDate date]; // your NSDate object
NSString *dateString = [dateFormatter stringFromDate:date];
Esto dará salida a algo como esto: 2001-01-02 at 13:00
Nota
Crear una instancia de
NSDateFormatter
es una operación costosa, por lo que se recomienda crearla una vez y reutilizarla cuando sea posible.
Extensión útil para convertir la fecha en cadena.
extension Date {
func toString() -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM dd yyyy"
return dateFormatter.string(from: self)
}
}
Enlaces útiles para una rápida formación de fechas que se obtienen rápidamente para ser humano legibles en la fecha .
Para construir formatos de fecha ver patrones de formato de fecha .
Convierta NSDate que se compone de hora y minuto (solo) a un NSDate completo
Hay muchos casos en los que uno ha creado una NSDate a partir de un formato de solo una hora y minuto, es decir: 08:12 que regresa de un servidor como una cadena e inicia una instancia de NSDate solo con estos valores.
El inconveniente de esta situación es que su NSDate está casi completamente "desnudo" y lo que debe hacer es crear: día, mes, año, segundo y huso horario para que este objeto "siga el ritmo" con otros tipos de NSDate.
En aras del ejemplo, digamos que hourAndMinute es el tipo NSDate que se compone de formato de hora y minuto:
C objetivo
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];
Ahora tu objeto es el opuesto total de estar "desnudo".
UTC Time offset from NSDate with TimeZone
Aquí, esto calculará el desplazamiento de tiempo UTC
de los datos actuales en la zona horaria deseada.
+(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;
}
Obtener el tipo de ciclo de tiempo (12 horas o 24 horas)
Comprobando si la fecha actual contiene el símbolo para AM o PM
C objetivo
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);
Solicitando el tipo de ciclo de tiempo de NSDateFormatter
C objetivo
NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
NSRange containsA = [formatStringForHours rangeOfString:@"a"];
BOOL is24h = containsA.location == NSNotFound;
Esto utiliza una cadena de plantilla de fecha especial llamada "j" que, de acuerdo con las especificaciones de la UCI ...
[...] solicita el formato de hora preferido para la configuración regional (h, H, K o k), según lo determinado por el atributo preferido del elemento horas en los datos complementarios. [...] Tenga en cuenta que el uso de 'j' en un esqueleto que se pasa a una API es la única forma de que el esqueleto solicite el tipo de ciclo de tiempo preferido de una localidad (12 horas o 24 horas).
Esa última oración es importante. Es "la única forma de que un esqueleto solicite el tipo de ciclo de tiempo preferido de un local". Dado que NSDateFormatter
y NSCalendar
se basan en la biblioteca de la UCI, lo mismo se aplica aquí.
Referencia
La segunda opción se deriva de esta respuesta .
Obtenga NSDate del formato de fecha JSON "/ Date (1268123281843) /"
Antes de Json.NET, las fechas se escribían con el formato de Microsoft: "/ Date (1198908717056) /". Si su servidor envía la fecha en este formato, puede usar el siguiente código para serializarlo a NSDate:
C objetivo
(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;
}
Obtenga tiempo histórico de NSDate (por ejemplo: hace 5s, hace 2m, hace 3h)
Esto se puede usar en varias aplicaciones de chat, feeds rss y aplicaciones sociales donde necesita tener las últimas feeds con marcas de tiempo:
C objetivo
- (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;
}