Ubuntu Version

Ubuntu 22.04 or 24.04, although the distribution is unimportant.

Problem Description

The date command returns the date in an unintuitive format that’s not that easy to read. This, unfortunately, can result in other commands returning that same format.

For example, this command (selected output only):

$ sudo tune2fs -l /dev/nvme0n1p2
Last mount time:          Sun May 11 18:40:00 2025
Last checked:             Thu Apr 24 10:06:02 2025

I would much rather that it returned an easily readable:

Last mount time:          2025-05-11 18:40:00
Last checked:             2025-04-24 10:06:02

Now, I know how to permanently change the default format for date (edit the relevant file in /usr/share/i18n/locales and run sudo locale-gen). But, this doesn’t affect other commands such as tune2fs.

Proposed Solution

What I’m hoping is that there already exists some command that takes in a stream, finds all dates, and converts them to a preferred format, while leaving all other input unchanged.

Thus, I could do something like this:

$ sudo tune2fs -l /dev/nvme0n1p2 | fixdate '+%F %T'

I wouldn’t like to try to program such a command myself, as my programming skills are amateur at best and, worse, limited to Bash, which is hardly ideal!

Do you know if something like my fixdate proposal exists? Or, do you know a better way to achieve what I’m after?

Lucky for you, the date command can output more formats, and even make it readable:

$ date --help
Usage: date [OPTION]... [+FORMAT]
  or:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display date and time in the given FORMAT.
With -s, or with [MMDDhhmm[[CC]YY][.ss]], set the date and time.

Mandatory arguments to long options are mandatory for short options too.
  -d, --date=STRING          display time described by STRING, not 'now'
      --debug                annotate the parsed date,
                              and warn about questionable usage to stderr
  -f, --file=DATEFILE        like --date; once for each line of DATEFILE
  -I[FMT], --iso-8601[=FMT]  output date/time in ISO 8601 format.
                               FMT='date' for date only (the default),
                               'hours', 'minutes', 'seconds', or 'ns'
                               for date and time to the indicated precision.
                               Example: 2006-08-14T02:34:56-06:00
  --resolution               output the available resolution of timestamps
                               Example: 0.000000001
  -R, --rfc-email            output date and time in RFC 5322 format.
                               Example: Mon, 14 Aug 2006 02:34:56 -0600
      --rfc-3339=FMT         output date/time in RFC 3339 format.
                               FMT='date', 'seconds', or 'ns'
                               for date and time to the indicated precision.
                               Example: 2006-08-14 02:34:56-06:00
  -r, --reference=FILE       display the last modification time of FILE
  -s, --set=STRING           set time described by STRING
  -u, --utc, --universal     print or set Coordinated Universal Time (UTC)
      --help        display this help and exit
      --version     output version information and exit

All options that specify the date to display are mutually exclusive.
I.e.: --date, --file, --reference, --resolution.

FORMAT controls the output.  Interpreted sequences are:

  %%   a literal %
  %a   locale's abbreviated weekday name (e.g., Sun)
  %A   locale's full weekday name (e.g., Sunday)
  %b   locale's abbreviated month name (e.g., Jan)
  %B   locale's full month name (e.g., January)
  %c   locale's date and time (e.g., Thu Mar  3 23:05:25 2005)
  %C   century; like %Y, except omit last two digits (e.g., 20)
  %d   day of month (e.g., 01)
  %D   date; same as %m/%d/%y
  %e   day of month, space padded; same as %_d
  %F   full date; like %+4Y-%m-%d
  %g   last two digits of year of ISO week number (see %G)
  %G   year of ISO week number (see %V); normally useful only with %V
  %h   same as %b
  %H   hour (00..23)
  %I   hour (01..12)
  %j   day of year (001..366)
  %k   hour, space padded ( 0..23); same as %_H
  %l   hour, space padded ( 1..12); same as %_I
  %m   month (01..12)
  %M   minute (00..59)
  %n   a newline
  %N   nanoseconds (000000000..999999999)
  %p   locale's equivalent of either AM or PM; blank if not known
  %P   like %p, but lower case
  %q   quarter of year (1..4)
  %r   locale's 12-hour clock time (e.g., 11:11:04 PM)
  %R   24-hour hour and minute; same as %H:%M
  %s   seconds since the Epoch (1970-01-01 00:00 UTC)
  %S   second (00..60)
  %t   a tab
  %T   time; same as %H:%M:%S
  %u   day of week (1..7); 1 is Monday
  %U   week number of year, with Sunday as first day of week (00..53)
  %V   ISO week number, with Monday as first day of week (01..53)
  %w   day of week (0..6); 0 is Sunday
  %W   week number of year, with Monday as first day of week (00..53)
  %x   locale's date representation (e.g., 12/31/99)
  %X   locale's time representation (e.g., 23:13:48)
  %y   last two digits of year (00..99)
  %Y   year
  %z   +hhmm numeric time zone (e.g., -0400)
  %:z  +hh:mm numeric time zone (e.g., -04:00)
  %::z  +hh:mm:ss numeric time zone (e.g., -04:00:00)
  %:::z  numeric time zone with : to necessary precision (e.g., -04, +05:30)
  %Z   alphabetic time zone abbreviation (e.g., EDT)

By default, date pads numeric fields with zeroes.
The following optional flags may follow '%':

  -  (hyphen) do not pad the field
  _  (underscore) pad with spaces
  0  (zero) pad with zeros
  +  pad with zeros, and put '+' before future years with >4 digits
  ^  use upper case if possible
  #  use opposite case if possible

After any flags comes an optional field width, as a decimal number;
then an optional modifier, which is either
E to use the locale's alternate representations if available, or
O to use the locale's alternate numeric symbols if available.

Examples:
Convert seconds since the Epoch (1970-01-01 UTC) to a date
  $ date --date='@2147483647'

Show the time on the west coast of the US (use tzselect(1) to find TZ)
  $ TZ='America/Los_Angeles' date

Show the local time for 9AM next Friday on the west coast of the US
  $ date --date='TZ="America/Los_Angeles" 09:00 next Fri'

Based on that, it looks to me like you can use date -I.

As such, you can use date -d STRING to input a date stream. Theoretically, you could feed stdout to STRING via a pipe | and then it can change it to whatever format you want. For example:

sudo tune2fs -l /dev/nvme0n1p2 | grep "mount time" | cut -d ":" -f 2 | xargs date -d {} -I`

You could, of course, play around with that. Since you’ve got multiple lines being returned, this may require a for...do...done loop for each line that gets returned.

I could probably write it, but I don’t have much time at the moment. :sweat_smile:

2 Likes

Thank you, yes, I could do it on a case-by-case basis, but that requires advance knowledge of what the stream would contain.

I was hoping for a more general case — often, Linux has unexpected functions.

It sure has. One favourite GOTO is Albert. After installing use datetime to see options. Or in Albert type mma to enter Mathematica land.
You could automate these UI features through a front end orchestrator such as Actiona. You will observe that I am a fan of UI interactions. Which can be scripted for multiple conversions. A bit slower perhaps, using a sledgehammer to crack a nut will go the argument. But is that important? Tempus fugit .

Albert looks interesting. Unfortunately, it’s hard from the little documentation to understand what exactly it does.

Actiona looks as though it might be a great replacement for tools such as xdotools. Do you know if it works on Wayland?

Re: Albert. It is an MIRV launch pad. Powerful.
Install then look for Albert icon … a blue infinity icon like Meta.
Show/Hide
Settings
Open Website

Try Settings.
There is a repository of plugins in Handlers.
And later you might add your own python Plugin(s).

For example the handler for date time is … datetime to launch One Stop query box for any process (default or custom) you can conceive, That is why my frequent use of visual metaphors links to Robot Gort in the 1951 sci film. But in another forum this mindmao link was tagged as “nonsense” Sublime Text. So be it. Can’t please everybody.

Re; question on Actiona working in Wayland. It is true that Wayland seems to be putting obstacles for UI wrangling on grounds of security. But even in Wayland there are desktop sessions to apply at login state. Look for Qt based desktop sessions. Can’t remember mine (about 6 installed) without logging in again and they are seen in cog icon bottom right in login screen BEFORE entering login password.

1 Like

@dragonfly41 — Thanks for all the detail! I didn’t understand all of it, and unfortunately I don’t know Python at all (Bash is my limit, ha ha). But it’s all useful information!

@paddylandau … before the idea is quenched …
(a) you don’t need to understand Python … others (me for one) can add those extensions to install as needs arise
(b) xdotool is not replaced by Actiona … instead pair them by adding xdotool into an Actiona Command object. Then you have leverage. Actiona is the overlord. It is not obsolete as some have written. You can save the source code and compile in QtCreator (if you wish). Do not be chained to Bash. Please.

1 Like

I remembered when logging in (the only window of opportunity before login password entry) to check the desktop sessions I can call upon to support direct UI interaction (or not). They are:

  • awesome
  • XkQT desktop
  • Plasma (X11)
  • Ubuntu (current session 22.04)
  • Xfce session
1 Like

This topic was automatically closed after 30 days. New replies are no longer allowed.