Ruby strftime: Mois sans zéro non significatif?

89

Ruby a-t- strftimeil un format pour le mois sans zéro non significatif?

J'ai trouvé %epour obtenir le jour sans le zéro non significatif, mais sans avoir de chance avec le mois.

En fin de compte, vouloir une date formatée comme: 9/1/2010

Shpigford
la source
2
Est-ce le 9 janvier ou le 1er octobre?
telent
@telent c'est cependant le client l'interprète :)
Factor Mystic
11
Je suis presque sûr que ce n'est pas le 1er octobre .....
brad

Réponses:

138

Certaines versions de strftimene permettent le préfixe avec moins pour formater les zéros non significatifs, par exemple:

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

Cependant, cela dépendra strftimede votre système. Donc, par souci de cohérence, je ferais plutôt quelque chose comme ceci:

dt = Time.local(2010, 'Sep', 1)
printf "%d/%d/%d", dt.day, dt.month, dt.year
Draegtun
la source
On dirait que le moins fonctionne très bien avec Ruby 1.8.7, merci!
Rob
2
@Rob: Oui, cela fonctionnera tant que votre système le strftimesupportera (par exemple, cela ne fonctionne pas ici sur la version 1.8.7 exécutée sur Mac OSX Snow Leopard).
draegtun
Ah oui, j'aurais dû préciser que c'était 1.8.7 sur Ubuntu Linux
Rob
A travaillé pour moi. 1.9.2p180 sur Ubuntu.
B Seven
Fonctionne pour moi avec 1.9.3 sur FreeBSD 9
user569825
39

Voici la liste de mise en forme dont je sors. Ceci est tiré de la documentation pour 2.1.3. Selon cela, vous voudriez %-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)

Mise à jour vers la dernière documentation 2.1.3 le 24/10/14

Rob Cameron
la source
7
Je cherche comment obtenir le mois sans le zéro non significatif ... pas le jour.
Shpigford
2
Pourquoi tout le monde vote-t-il ce post DOWN? J'aurais pensé qu'il serait utile d'avoir cette liste d'aides strftime!
Rob Cameron
4
J'imagine que les gens votent contre parce que cela ne répond pas à la question. En elle-même, la liste est assez utile, mais aucune de ces options n'empêche le début du "0" pour le mois comme le PO l'a demandé.
Benry
1
+1 Bien que cette question ne réponde pas à la question initiale, elle est utile aux autres personnes qui recherchent quelque chose de similaire sur Google, mais pas exactement l'OP.
David Oneill
1
% e fournit un espace de début (c'est-à-dire "1/01/2012") qui peut être indésirable et n'est pas nécessairement ce que le PO voulait.
brad
8

Les documents présentent un certain nombre d'options différentes pour configurer le format des nombres. En ajoutant au format% -d, vous pouvez également utiliser ces indicateurs à la place 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
la source
7

J'ai eu un problème similaire et je l'ai résolu en le convertissant strftime("%m")en entier.

Par exemple:

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

Simple, mais pas élégant.

cyberw0rm
la source