Ruby strftime: ¿Mes sin cero a la izquierda?

89

¿Ruby strftimetiene un formato para el mes sin un cero a la izquierda?

Lo encontré %epara obtener el día sin el cero inicial, pero no tuve suerte con el mes.

En última instancia, queriendo una fecha formateada como: 9/1/2010

Shpigford
fuente
2
¿Es el 9 de enero o el 1 de octubre?
Telent
@telent es como el cliente lo interpreta :)
Factor Mystic
11
Estoy bastante seguro de que no es el 1 de octubre .....
Brad

Respuestas:

138

Algunas versiones de strftimepermiten el prefijo con menos para formatear los ceros iniciales, por ejemplo:

strftime "%-d/%-m/%y"

Sin embargo, esto dependerá strftimede su sistema. Entonces, por coherencia, haría algo como esto en su lugar:

dt = Time.local(2010, 'Sep', 1)
printf "%d/%d/%d", dt.day, dt.month, dt.year
draegtun
fuente
Parece que el signo negativo funciona bien con Ruby 1.8.7, ¡gracias!
Rob
2
@Rob: Sí, funcionará siempre que su sistema lo strftimeadmita (por ejemplo, no funciona aquí en 1.8.7 ejecutándose sobre Mac OSX Snow Leopard).
draegtun
Ah, sí, debería haber aclarado que era 1.8.7 en ubuntu linux
Rob
Trabajó para mi. 1.9.2p180 en Ubuntu.
B Seven
Funciona para mí con 1.9.3 en FreeBSD 9
user569825
39

Aquí está la lista de formato de la que salgo. Esto es de los documentos de 2.1.3. De acuerdo con esto, querrás %-m:

Date (Year, Month, Day):
  %Y - Year with century (can be negative, 4 digits at least)
          -0001, 0000, 1995, 2009, 14292, etc.
  %C - year / 100 (rounded down such as 20 in 2009)
  %y - year % 100 (00..99)

  %m - Month of the year, zero-padded (01..12)
          %_m  blank-padded ( 1..12)
          %-m  no-padded (1..12)
  %B - The full month name (``January'')
          %^B  uppercased (``JANUARY'')
  %b - The abbreviated month name (``Jan'')
          %^b  uppercased (``JAN'')
  %h - Equivalent to %b

  %d - Day of the month, zero-padded (01..31)
          %-d  no-padded (1..31)
  %e - Day of the month, blank-padded ( 1..31)

  %j - Day of the year (001..366)

Time (Hour, Minute, Second, Subsecond):
  %H - Hour of the day, 24-hour clock, zero-padded (00..23)
  %k - Hour of the day, 24-hour clock, blank-padded ( 0..23)
  %I - Hour of the day, 12-hour clock, zero-padded (01..12)
  %l - Hour of the day, 12-hour clock, blank-padded ( 1..12)
  %P - Meridian indicator, lowercase (``am'' or ``pm'')
  %p - Meridian indicator, uppercase (``AM'' or ``PM'')

  %M - Minute of the hour (00..59)

  %S - Second of the minute (00..60)

  %L - Millisecond of the second (000..999)
       The digits under millisecond are truncated to not produce 1000.
  %N - Fractional seconds digits, default is 9 digits (nanosecond)
          %3N  millisecond (3 digits)
          %6N  microsecond (6 digits)
          %9N  nanosecond (9 digits)
          %12N picosecond (12 digits)
          %15N femtosecond (15 digits)
          %18N attosecond (18 digits)
          %21N zeptosecond (21 digits)
          %24N yoctosecond (24 digits)
       The digits under the specified length are truncated to avoid
       carry up.

Time zone:
  %z - Time zone as hour and minute offset from UTC (e.g. +0900)
          %:z - hour and minute offset from UTC with a colon (e.g. +09:00)
          %::z - hour, minute and second offset from UTC (e.g. +09:00:00)
  %Z - Abbreviated time zone name or similar information.

Weekday:
  %A - The full weekday name (``Sunday'')
          %^A  uppercased (``SUNDAY'')
  %a - The abbreviated name (``Sun'')
          %^a  uppercased (``SUN'')
  %u - Day of the week (Monday is 1, 1..7)
  %w - Day of the week (Sunday is 0, 0..6)

ISO 8601 week-based year and week number:
The first week of YYYY starts with a Monday and includes YYYY-01-04.
The days in the year before the first week are in the last week of
the previous year.
  %G - The week-based year
  %g - The last 2 digits of the week-based year (00..99)
  %V - Week number of the week-based year (01..53)

Week number:
The first week of YYYY that starts with a Sunday or Monday (according to %U
or %W). The days in the year before the first week are in week 0.
  %U - Week number of the year. The week starts with Sunday. (00..53)
  %W - Week number of the year. The week starts with Monday. (00..53)

Seconds since the Epoch:
  %s - Number of seconds since 1970-01-01 00:00:00 UTC.

Literal string:
  %n - Newline character (\n)
  %t - Tab character (\t)
  %% - Literal ``%'' character

Combination:
  %c - date and time (%a %b %e %T %Y)
  %D - Date (%m/%d/%y)
  %F - The ISO 8601 date format (%Y-%m-%d)
  %v - VMS date (%e-%^b-%4Y)
  %x - Same as %D
  %X - Same as %T
  %r - 12-hour time (%I:%M:%S %p)
  %R - 24-hour time (%H:%M)
  %T - 24-hour time (%H:%M:%S)

Actualizado a los últimos documentos 2.1.3 el 24/10/14

Rob Cameron
fuente
7
Estoy buscando cómo obtener el mes sin el cero inicial ... no el día.
Shpigford
2
¿Por qué todos votan ABAJO esta publicación? ¡Pensé que sería útil tener esta lista de ayudantes de strftime!
Rob Cameron
4
Me imagino que la gente lo está rechazando porque no responde a la pregunta. Por sí misma, la lista es bastante útil, pero ninguna de estas opciones evita el "0" inicial para el mes como lo solicitó el OP.
Benry
1
+1 A pesar de que esta pregunta no responde a la pregunta original, es útil para otras personas que buscan en Google algo similar, pero no exactamente el OP.
David Oneill
1
% e proporciona un espacio inicial (es decir, "1/01/2012") que puede ser indeseable y no es necesariamente lo que quería el OP.
brad
8

Los documentos muestran una serie de opciones diferentes para configurar el formato de número. Agregando al formato% -d, también puede usar estos indicadores en lugar de "-":

Flags:
  -  don't pad a numerical output.
  _  use spaces for padding.
  0  use zeros for padding.
  ^  upcase the result string.
  #  change case.
  :  use colons for %z.
typeoneerror
fuente
7

Tuve un problema similar y lo solucioné convirtiéndolo strftime("%m")en un número entero.

Por ejemplo:

strftime("%m")+0 give the current month as integer 'without leading zero'

Sencillo, aunque no elegante.

cyberw0rm
fuente