fbpx
 

Como trabajar con Fechas [Parte 1]

Como trabajar con Fechas [Parte 1]

1. Introducción

No importa el tipo de proyecto en el que estés trabajando.

Da igual si es un proyecto de pocas semanas o de varios meses.

Puede que seáis varios desarrolladores o que trabajes solo.

Todo eso da igual.

Si estás desarrollando una aplicación, es casi 100% seguro que en algún momento tendrás que trabajar con fechas.

No es difícil de dominar y es algo por lo que tarde o temprano tendrás que pasar. Simplemente tienes que tener claro como trabajar con NSDate en iOS.

2. ¿Qué vamos a ver en este Tutorial?

La operación más común que tendrás que realizar cuando trabajes con objetos de tipo NSDate en una aplicación, será convertirlos a objetos de tipo NSString, para poder presentarlos en un formato adecuado a los usuarios.

También es probable que tengas que realizar la operación inversa: Convertir strings a objetos NSDate. Sin embargo, estas no son las únicas tareas relacionadas con NSDate a las que tendrás que hacer frente. Es probable que por ejemplo, tengas que:

  • Comparar fechas
  • Calcular fechas futuras o fechas pasadas, utilizando una fecha de referencia (Por ejemplo, la fecha actual) y añadiendo o quitando periodos de tiempo (días, meses, años, etc)
  • Calcular diferencias entre fechas (Por ejemplo, cuanto tiempo ha pasado entre dos fechas concretas)
  • Dividir una fecha en componentes y acceder a cada uno de ellos por separado (meses, días, horas…)

Todo esto, incluyendo las típicas conversiones entre NSDate y NSString lo veremos en este tutorial.

3. Sobre nuestra Aplicación Demo

En este tutorial no vamos a crear una app demo como tal sino que trabajaremos directamente en un Playground. Es la mejor opción, ya que de esta forma podremos ver cada una de las operaciones más comunes con NSDate de forma clara y sin preocuparnos por tener que desarrollar una aplicación, que únicamente nos haría perder el tiempo.

A pesar de que puedes descargar desde aquí el playground que vamos a desarrollar y que contiene todo el código que vamos a crear te recomiendo que crees un nuevo playground y que vayamos juntos, linea por linea, creando y entendiendo cada código.

De esta forma, será más fácil que comprendas como funciona todo y estarás capacitado para realizar cualquier modificación que necesitas y aplicarla en tus propios proyectos.

El fichero playground que vamos a crear se llama PlayingWithDates. Puedes llamarlo igual o utilizar el nombre que mejor te parezca.

Lo primero que tienes que hacer una vez que hayas creado el fichero playground es añadir la siguiente linea a la parte superior del mismo:

Esto nos permitirá importar el framework UIKit, que utilizaremos para trabajar a lo largo de todo el tutorial.

4. Conceptos Básicos

Antes de comenzar es importante tratar algunos conceptos fundamentales.

Comencemos por la clase NSDate.

Un objeto de este tipo describe tanto una fecha como una hora, por lo que no lo utilizaremos únicamente cuando queramos trabajar con fechas sino que tendremos que utilizarlo también cuando únicamente nos queramos referir a horas concretas.

El concepto de “formato” no existe cuando hablamos de objetos NSDate. Simplemente piensa en la fecha y la hora como propiedades, al igual que cualquier otra propiedad de otras clases. Si que necesitaremos aplicar formatos determinados cuando queramos convertir objetos NSDate en objetos NSString y para ello contamos con una clase específica para esta tarea, pero eso es algo que veremos más adelante.

Simplemente quédate con que la clase NSDate es todo lo que necesitas, tanto si estás interesado únicamente en fechas, como si te interesan las horas, o ambas cosas.

Existe otra clase con la que vamos a trabajar: NSDateFormatter. Esta clase es la que nos permite realizar conversiones entre las clases NSDate y NSString. También nos permite personalizar el formato del string que mostraremos al usuario con una fecha concreta, mediante algunos estilos predefinidos o mediante la especificación de un estilo totalmente personalizado.

Veremos varios ejemplos de este tipo y conversiones en ambos sentidos.

Los objetos NSDateFormatter además también soportan localización. Lo único que necesitamos es utilizar un objeto NSLocale válido y el objeto final será representado en base a los valores de localización especificados.

Una vez vista toda la teoría, vamos a pasar a ver todo esto con ejemplos claros y detallados. Si algún concepto que hayamos comentado aquí no te ha quedado claro del todo, no te preocupes, vamos a verlo paso a paso a continuación.

Te recomiendo entonces, que crees tu propio fichero playground en Xcode y que comiences a la vez que yo a desarrollar cada uno de los ejemplos.

[caja-roja]No hay mejor forma de entender algo que hacerlo tu mismo[/caja-roja]

5. Realizando Conversiones entre NSDate y NSString

Vamos a comenzar a trabajar con la clase NSDate declarando una constante donde almacenaremos la fecha actual. Obtener la fecha actual no requiere ningún método especial como now() o today() , como en otros lenguajes. Lo único que hace falta es inicializar un objeto NSDate y directamente ese objeto se creará con la fecha y hora actual:

Aquí tienes el valor almacenado en la variable currentDate:

NSDate post9_imagen1

Ahora vamos a crear un objeto NSDateFormatter que utilizaremos para realizar conversiones entre NSDate y NSString:

Nuestro objeto NSDateFormatter utilizará la configuración regional que esté especificada en los ajustes del dispositivo. Si nuestra región es España y nuestro calendario es “Calendario Gregoriano”, el formateo de la fecha se hará en base a estos parámetros.

Puedes consultar la configuración del dispositivo, en el Menú Ajustes>General>Idioma y región:

NSDate post9_imagen2

Si en lugar de depender de estos ajustes, prefieres especificar manualmente la configuración regional puedes hacerlo de la siguiente forma:

Evidentemente si realizamos estas dos líneas una detrás de otra, la configuración regional que quedará establecida será “es_ES”, ya que únicamente podemos especificar un locale. ¿Tienes curiosidad como afecta la configuración regional al formato de las fechas? Lo veremos un poco mas adelante.

6. Formateando la salida utilizando los estilos predefinidos

Antes de convertir un objeto NSDate en NSString, tendremos que especificar cual queremos que sea el formato de este NSString. No es lo mismo mostrar por pantalla “Lunes, 16 de Octubre de 2016” que “Lun, 16 Oct 2016”

Existen dos formas de hacer esto. La primera es utilizando los estilos predefinidos conocidos como “formatter styles” y la segunda es definiendo nosotros mismos los estilos, utilizando ciertos especificadores.

Primero veremos como utilizar estos estilos predefinidos y un poco más adelante veremos como definirlo nosotros mismos.

En el siguiente ejemplo utilizaremos el enum NSDateFormatterStyle. Cada uno de sus posibles valores representa un tipo diferente de formato y como no son demasiados, vamos a verlos uno por uno. El primer estilo soportado es Full Style, y sus resultados se muestran en la siguiente imagen:

NSDate post9_imagen3

Aquí tienes el código por si quieres copiarlo y pegarlo en tu playground:

En la primera de las líneas especificamos que el estilo del NSDateFormatter sea FullStyle.

En la segunda linea creamos una variable convertedDate y almacenamos en ella la fecha con el formato que hemos especificado (FullStyle). Date cuenta que la conversión se realiza simplemente con el método stringFromDate. Utilizarás mucho este método en tus proyectos para realizar conversiones de fechas.

Ahora veremos con ejemplos similares el resto de estilos:

Long Style

NSDate post9_imagen4

Medium Style

NSDate post9_imagen5

Short Style

NSDate post9_imagen6

Ahora que has visto los 4 posibles estilos, es posible que alguno de ellos te sirva para formatear fechas en tus proyectos pero también puede ocurrir que ninguno de ellos sea lo que buscas. Puede ser que prefieras especificar tu mismo el formato de salida. Eso lo veremos en el siguiente apartado.

Antes me gustaría enseñarte, como las modificaciones de la configuración regional afectan al string final obtenido a partir de la fecha original. Para este ejemplo, utilizaremos el Full Style y dos identificadores de configuración regional (Español: “es_ES” y Griego: “el_GR”):

NSDate post9_imagen7

Como puedes ver, la configuración regional del dispositivo cambia totalmente como se muestran por pantalla las fechas.

7. Utilizando formatos de fecha personalizados

Los dateFormatter utilizados arriba son bastante útiles para muchos casos. Sin embargo, no pueden ser modificados para conseguir formatos diferentes. Si lo que queremos es un formato de fecha personalizado tendremos que describirlo nosotros mismos. Los formatos de fecha personalizados son perfectos en dos casos concretos:

  • Necesitamos un formato diferente a los formatos predefinidos que nos ofrece NSDateFormatterStyle
  • Necesitamos convertir un string complejo (P.e: “Thu, 16 Nov 2016 11:14:56 GMT”) en un objeto NSDate

Para conseguir el formato que deseamos debemos utilizar una combinación de especificadores. Los especificadores no son nada más que caracteres simples que tienen un significado especial para el objeto dateFormatter.

Antes de que sigamos con los ejemplos, déjame mostrarte la lista de especificadores que debes conocer:

  • EEEE: Nombre completo del día (P.e: Lunes). Utiliza 1-3 letras para la representación abreviada del día
  • MMMM: Nombre completo del mes (P.e: Octubre). Utiliza 1-3 letras para la representación abreviada del mes
  • dd: Número del día del mes
  • yyyy: El año con 4 dígitos (P.e: 2015)
  • HH: La hora con 2 dígitos (P.e: 09 ó 22)
  • mm: Los minutos con 2 dígitos (P.e: 03 ó 46)
  • ss: Los segundos con 2 dígitos (P.e: 16 ó 52)
  • zzz: La zona horaria con 3 letras (P.e: GMT)
  • GGG: Antes de Cristo (BC) o Después de Cristo (AD)

Si quieres ampliar información sobre los especificadores, puedes visitar la documentación oficial: http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns donde encontrarás variaciones de estos especificadores y algunos más que no hemos mencionado aquí.

Continuemos con nuestros ejemplos y veamos como se utilizan los especificadores.

Vamos a convertir la fecha actual en un string y a obtener el día completo, el mes completo, el día del mes y el año:

NSDate post9_imagen8

No hace falta decir mucho sobre este código ya que es autoexplicativo.

Veamos ahora como aplicar un formato a la hora:

NSDate post9_imagen9

8. Como convertir NSString a NSDate

Todos los ejemplos que hemos visto hasta ahora trataban sobre como pasar objetos de tipo NSDate a objetos de tipo NSString. En nuestros proyectos, en muchas ocasiones necesitaremos realizar el proceso contrario. Todo lo que hemos visto acerca de los estilos para formatear fechas y los especificadores se aplicará también aquí. Lo más importante a la hora de convertir un NSString en un objeto de tipo NSDate es definir correctamente el valor de la propiedad dateFormat del objeto dateFormatter y dejar que el método dateFromString() realice su trabajo. Veamos un ejemplo:

NSDate post9_imagen10

Veamos otro ejemplo donde también incluimos la zona horaria:

NSDate post9_imagen11

9. Resumen Final

La parte más importante del tutorial podría resumirse de la siguiente forma:

  • Si quieres pasar de NSDate a NSString:
    • 1. Crea un objeto de tipo NSDateFormatter.
    • 2. Especifica el estilo del string con su propiedad dateSyle.
    • 3. Utiliza su método stringFromDate() para realizar la conversión.
  • Si quieres pasar de NSString a NSDate:
    • 1. Crea un objeto de tipo NSDateFormatter.
    • 2. Especifica el formato de la fecha con su propiedad dateFormat.
    • 3. Utiliza su método dateFromString() para realizar la conversión.

10. ¿Donde ir ahora?

Puedes descargar el playground con todos los ejemplos que hemos desarrollado desde aquí.

Además, aquí tienes la segunda parte de este tutorial, donde podrás ver los siguientes puntos:

  • Dividir una fecha completa en partes, obteniendo los valores individuales.
  • Comparar fechas y horas.
  • Calcular fechas pasadas y futuras.
  • Calcular el intervalo de tiempo que ha pasado entre dos fechas.

Espero que este tutorial te haya aclarado algunas cosas sobre la forma de trabajar con fechas en iOS.

Si tienes cualquier duda, utiliza la sección de comentarios situada en la parte inferior.

Como siempre, te agradecería enormemente que lo compartieras en redes sociales. De esta forma Efecto/Apple podrá llegar cada vez a más gente.

Etiquetas:
4 Comentarios
  • Aitor Uranga
    Publicado a las 09:40h, 27 septiembre Responder

    Me ha resultado muy útil. Gracias por dedicar parte de tu tiempo en hacer estos tutoriales para ayudar a gente como yo. Estaré atento a las siguientes publicaciones.

    Un saludo

    • Luis R
      Publicado a las 19:17h, 27 septiembre Responder

      Muchas gracias Aitor.

      Comentarios como éste ayudan a seguir trabajando en el blog.

      Un saludo!

  • Pep
    Publicado a las 19:10h, 15 agosto Responder

    Parece que NSDateFormatter a pasado a ser DateFormatter,
    NSDateFormatterStyle a pasado a ser DateFormatter.Style
    y NSDateFormatterStyle.FullStyle a pasado a ser DateFormatter.Style.full

    luego el stringFromDate no consigo descifrarlo…

    Gracias y saludos

  • Pep
    Publicado a las 19:31h, 15 agosto Responder

    Entonces:
    // Full style
    dateFormatter.dateStyle = NSDateFormatterStyle.FullStyle
    var convertedDate = dateFormatter.stringFromDate(currentDate)

    ¿Pasa a ser?
    // Full style
    dateFormatter.dateStyle = DateFormatter.Style.full
    var convertedDate = dateFormatter.string(from:currentDate as Date)

    Así parece funcionar, pero quizás tiene consecuencias que no comprendo.
    Saludos

Escribe un comentario

10AppsIpad

Descarga las 10 Aplicaciones

Introduce tu Nombre y tu Email para recibir las Apps en tu Correo

Acabo de enviarte un email. Sigue las instrucciones para descargar las Aplicaciones. Puede que tengas que revisar tu buzón de correo no deseado. Gracias.