2010-09-30 20 views
76

Ruby's strftime ha un formato per il mese senza uno zero iniziale?Strage di ruby: mese senza zero iniziale?

Ho trovato %e per ottenere il giorno senza lo zero iniziale, ma senza avere fortuna con il mese.

definitiva che vogliono una data formattata come: 9/1/2010

+2

È il 9 gennaio o il 1 ottobre? – telent

+0

@telent è comunque il client che lo interpreta :) –

+9

Sono abbastanza sicuro che non è il 1 ° ottobre ..... – brad

risposta

112

Alcune versioni di strftime non consentire anteponendo meno formattare fuori zeri iniziali, per esempio:

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

Tuttavia questo dipenderà strftime su il tuo sistema. Quindi, per coerenza, farei invece una cosa del genere:

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

Sembra che il meno funzioni perfettamente con Ruby 1.8.7, grazie! – Rob

+2

@Rob: Sì, funzionerà fino a quando lo 'strftime' del sistema lo supporta (per esempio non funziona qui su 1.8.7 su Mac OSX Snow Leopard). – draegtun

+0

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

31

Ecco l'elenco di formattazione da cui parti. Questo è dai documenti per 2.1.3. In base a questo si vorrebbe %-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 alle ultime 2.1.3 documenti su 10/24/14

+7

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

+2

Perché tutti votano questo post DOWN? Avrei pensato che sarebbe stato utile avere questa lista di aiutanti di strftime! –

+4

Immagino che la gente stia votando perché non risponde alla domanda.Di per sé, la lista è abbastanza utile, ma nessuna di queste opzioni impedisce lo "0" iniziale del mese come l'OP richiesto. – Benry

6

Ho avuto un problema simile e riparato convertendo strftime("%m") in un intero.

Ad esempio:

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

semplice, anche se non elegante.

7

I documenti mostrano diverse opzioni per la configurazione del formato numerico. 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. 
Problemi correlati