Ruby strftime: mese senza zero iniziale?


89

Ruby strftimeha un formato per il mese senza zero iniziale?

Ho trovato %eper ottenere il giorno senza lo zero iniziale, ma non avendo fortuna con il mese.

In definitiva, volendo una data formattata come: 9/1/2010


2
È il 9 gennaio o il 1 ottobre?
telent

@telent è comunque il cliente lo interpreta :)
Factor Mystic

11
Sono abbastanza sicuro che non sia il 1 ° ottobre .....
Brad

Risposte:


138

Alcune versioni di strftimeconsentono il prefisso con meno per formattare gli zeri iniziali, ad esempio:

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

Tuttavia questo dipenderà strftimedal tuo sistema. Quindi, per coerenza, farei qualcosa del genere invece:

dt = Time.local(2010, 'Sep', 1)
printf "%d/%d/%d", dt.day, dt.month, dt.year

Sembra che il segno meno funzioni bene con Ruby 1.8.7, grazie!
Rob

2
@Rob: Sì, funzionerà fintanto che il tuo sistema lo strftimesupporta (ad esempio, non funziona qui su 1.8.7 in esecuzione su Mac OSX Snow Leopard).
draegtun

Ah sì, avrei dovuto chiarire che era 1.8.7 su ubuntu linux
Rob

Ha funzionato per me. 1.9.2p180 su Ubuntu.
B Seven

Funziona per me con 1.9.3 su FreeBSD 9
user569825

39

Ecco l'elenco di formattazione da cui esco. Questo è dai documenti per 2.1.3. Secondo questo vorresti %-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)

Aggiornato ai documenti 2.1.3 più recenti il ​​24/10/14


7
Sto cercando come ottenere il mese senza lo zero iniziale ... non il giorno.
Shpigford,

2
Perché tutti votano questo post GIÙ? Avrei pensato che sarebbe stato utile avere questo elenco di aiutanti strftime!
Rob Cameron

4
Immagino che le persone lo stiano votando perché non risponde alla domanda. Di per sé, l'elenco è abbastanza utile, ma nessuna di queste opzioni impedisce lo "0" iniziale per il mese come richiesto dall'OP.
Benry

1
+1 Nonostante questa domanda non risponde alla domanda originale, è utile ad altre persone che cercano qualcosa di simile su Google, ma non esattamente l'OP.
David Oneill

1
% e fornisce uno spazio iniziale (ad esempio "1/01/2012") che può essere indesiderabile e non è necessariamente quello che voleva l'OP.
brad

8

I documenti mostrano una serie di opzioni diverse per la configurazione del formato dei numeri. Aggiungendo al formato% -d, puoi anche usare questi flag al posto di "-":

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.

7

Ho avuto un problema simile e l'ho risolto convertendolo strftime("%m")in un numero intero.

Per esempio:

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

Semplice, anche se non elegante.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.