How can I change the default date format (using LC_TIME)?

10,213

In LC_TIME, there seems to be a separate way to specify the format for the date(1) command. This can be seen in 16.04's en_US locale definition:

% Appropriate date representation (date(1))   "%a %b %e %H:%M:%S %Z %Y"
date_fmt    "<U0025><U0061><U0020><U0025><U0062><U0020><U0025><U0065>/
<U0020><U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053><U0020>/
<U0025><U005A><U0020><U0025><U0059>"
END LC_TIME

These lines are missing from 17.04 and newer's en_US locale definition, but is still present in the C and POSIX locale files (so date maybe using these as a fallback).

If I do edit the en_US locale to add a date_fmt setting before END LC_TIME and update the locales, it works fine:

# grep date_fmt /usr/share/i18n/locales/en_US
date_fmt "%F %Z"
# env LC_TIME=en_US.UTF-8 date
2018-08-13 JST
# date
Mon Aug 13 15:25:14 JST 2018
# sed -i 's/date_fmt.*/date_fmt "%Y"/' /usr/share/i18n/locales/en_US
# locale-gen en_US.UTF-8
Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.
# env LC_TIME=en_US.UTF-8 date
2018
Share:
10,213

Related videos on Youtube

Gowtham
Author by

Gowtham

Updated on September 18, 2022

Comments

  • Gowtham
    Gowtham almost 2 years

    How do I change the format of date command by modifying LC_TIME in locale?

    Currently the day of month uses %e format. I need it to be displayed in %d format.

    Below is the Current Format:

    #date
    Thu Aug 9 18:26:11 IST 2018
    

    Expected format:

    #date
    Thu Aug 09 18:26:11 IST 2018
    

    Here is my locale:

    #locale
    LANG=en_US.UTF-8
    LANGUAGE=
    LC_CTYPE=en_IN
    LC_NUMERIC="en_US.UTF-8"
    LC_TIME="en_US.UTF-8"
    LC_COLLATE="en_US.UTF-8"
    LC_MONETARY="en_US.UTF-8"
    LC_MESSAGES="en_US.UTF-8"
    LC_PAPER="en_US.UTF-8"
    LC_NAME="en_US.UTF-8"
    LC_ADDRESS="en_US.UTF-8"
    LC_TELEPHONE="en_US.UTF-8"
    LC_MEASUREMENT="en_US.UTF-8"
    LC_IDENTIFICATION="en_US.UTF-8"
    LC_ALL=
    

    LC_TIME section in /usr/share/i18n/locales/en_US:

        LC_TIME
    abday   "Sun";"Mon";"Tue";"Wed";"Thu";"Fri";"Sat"
    day "Sunday";/
        "Monday";/
        "Tuesday";/
        "Wednesday";/
        "Thursday";/
        "Friday";/
        "Saturday"
    
    week 7;19971130;1
    abmon   "Jan";"Feb";/
        "Mar";"Apr";/
        "May";"Jun";/
        "Jul";"Aug";/
        "Sep";"Oct";/
        "Nov";"Dec"
    mon "January";/
        "February";/
        "March";/
        "April";/
        "May";/
        "June";/
        "July";/
        "August";/
        "September";/
        "October";/
        "November";/
        "December"
    % Appropriate date and time representation (%c)
    d_t_fmt "%a %d %b %Y %r %Z"
    %
    % Appropriate date representation (%x)
    d_fmt   "%m//%d//%Y"
    %
    % Appropriate time representation (%X)
    t_fmt   "%r"
    %
    % Appropriate AM/PM time representation (%r)
    t_fmt_ampm "%I:%M:%S %p"
    %
    % Strings for AM/PM
    %
    am_pm   "AM";"PM"
    date_fmt "%F %Z"
    END LC_TIME
    

    Please let me know what I can do in order to get the expected format.

    NOTE: I need to execute just date command without any formatting options.

    • goo
      goo almost 6 years
      SInce strings $(type -p date) | grep LC shows no output, it is clear that date is not influenced by LC_TIME. You cannot "Change Default Date format using LC_TIME"
    • danzel
      danzel almost 6 years
      @waltinator date is indeed influenced by LC_TIME. date's texinfo also explicitly recommends to set LC_TIME to C in order to produce locale independent output.
    • Gowtham
      Gowtham almost 6 years
      @danzel do you have the solution?..
    • danzel
      danzel almost 6 years
      @Goron I'm not sure what you want to achieve. Why don't you just use a custom format string like date +"%a %b %d %T %Z %Y"?
    • Gowtham
      Gowtham almost 6 years
      @danzel yes I can do it.. but the thing is.. I have few 3rd party libraries relied upon date output. Currently it's expecting format with %d..
    • goo
      goo almost 6 years
      The dt_t_fmt looked like Unicoded ASCII, so I decoded it. It is %A %d %B %Y %I:%M:%S %p %Z date "+%A %d %B %Y %I:%M:%S %p %Z" --date=yesterday (today is the 10th) gives Thursday 09 August 2018 02:12:57 PM EDT
    • Gowtham
      Gowtham almost 6 years
      But date gives Thu Aug 9 18:26:11 IST 2018 ... Which is different from LC_TIME d_t_fmt format defined in en_IN.. ..
  • Gowtham
    Gowtham almost 6 years
    Thanks for the answer @muru.. I have done the same way as you said. But still i get the same format as before.. #date Mon Aug 13 06:40:12 UTC 2018 # cat en_US | grep date_fmt date_fmt "%F %Z" # locale-gen en_US.UTF-8 Generating locales (this might take a while)... en_US.UTF-8... done Generation complete. # env LC_TIME=en_US.UTF-8 date Mon Aug 13 06:48:44 UTC 2018 ... Am I missing anything?..
  • muru
    muru almost 6 years
    @Goron where in /usr/share/i18n/locales/en_US did you add date_fmt? Please edit the question to add more details.
  • Gowtham
    Gowtham almost 6 years
    I have edited the /usr/share/i18n/locales/en_US please check and confirm... or should I edit d_t_fmt "%a %d %b %Y %r %Z" line?...
  • muru
    muru almost 6 years
    Hmm, then I have no idea. I just tried out what you did in a fresh docker container and had no problems. :/
  • Gowtham
    Gowtham almost 6 years
    Ok @muru .. You tried in Ubuntu server 18?
  • muru
    muru almost 6 years
    @Goron on Docker images of 17.04, 17.10 and 18.04.
  • Gowtham
    Gowtham almost 6 years
    then it should work ... I Will check what's wrong and get back..
  • Gowtham
    Gowtham almost 6 years
  • Gowtham
    Gowtham almost 6 years
    locate LC_TIME gives /usr/lib/locale/C.UTF-8/LC_TIME does this mean I need to modify C in locales??