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;
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow