Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

When I view a message in the pager mutt displays the time in the Date header in UTC rather than my local time zone. The index view displays the local time correctly. I found this old mailing list post that describes how to get the local time to display in the status bar at the bottom of the screen, but this still doesn't "fix" the time in the Date header at the top of the screen. Is there any way to get the pager to convert the Date header time to local time?

share|improve this question
up vote 9 down vote accepted

The formatting in the index is controlled by the index_format setting -- it's generated by mutt. The Date header isn't controlled by mutt, it's a header included with the message that just gets displayed. If it shows UTC time it's because the sending server decided to use UTC when generating the header. The only way to change it is to actually change the message itself, either when you receive it or when you view it.

Changing it as it comes in means adding a filter to your mail delivery agent, but it needs to be sophisticated enough to parse the existing Date header and rewrite it. It's almost certainly better to just have mutt reformat the message when you look at it. You can set the display_filter property to an executable file, and it will pipe any message you open through the executable before displaying it.

You'll need to write a program or shell script that reads each line of the message and replaces the one with the Date header, or find an existing script (there's one here that might work, although it doesn't seem like it should really be necessary to involve a temporary file)

share|improve this answer

Taking Gilles' advice, here's a version that uses a temp file and formail.


# save the message to a file
cat - >"$TMPFILE"
# extract the date header
DATE=$( formail -xDate: < "$TMPFILE" )
# convert to the current timezone (defined by TZ)
DATE=$( date -R -d "$DATE" )
# output the modified message
echo "Date: $DATE"
formail -fI Date < "$TMPFILE"
# clean up
rm -f "$TMPFILE"
share|improve this answer


This suggests using the 'pager_format', to make it show the letter date in the local timezone:

set pager_format="%4C %Z %[!%b %e at %I:%M %p] %.20n %s%* -- (%P)"

share|improve this answer
This works very well, also for index_format. – MrTweek Apr 23 '14 at 4:57

Here is a procmail solution:

# extract date from mail
TMPDATE=| formail -x Date

# get local date
LOCALDATE=`date --rfc-2822 -d "$TMPDATE"`

# add it new header to the mail
:0 f
| formail -I "LocalDate: $LOCALDATE"

And display LocalDate: in muttrc:

unignore localdate
share|improve this answer
how do you invoke this? – Janus Troelsen Sep 14 '15 at 16:31

I made a shell script as described at the end of Michael's answer that does the job for me:

while IFS= read -r LINE; do
    if [[ "${LINE}" =~ ^Date:\ .* ]]; then
        DATE=${LINE#Date: }
        # convert to the current timezone (defined by TZ)
        DATE=$(date -d "${DATE}")
        printf '%s' "Date: ${DATE}"
    elif [[ -n $LINE ]]; then
      # We've reach the end of the headers, so stop parsing
      exec cat
        printf '%s\n' "${LINE}"
share|improve this answer
Parsing emails is pretty tricky. I recommend using a dedicated tool like formail (part of the procmail package) or reformail (part of maildrop) to extract the existing Date: header and put a new one in place. Take care of edge cases such as a missing or malformatted Date: header. – Gilles Aug 15 '11 at 16:29

Obligatory Perl solution that preserves the "Date" header while adding an extra "Local-Date" header to contain the localtime version:

#!/usr/bin/perl -n

use Date::Parse;
use POSIX;
use strict;

if (/^Date: /) {
    my $datestr = substr ($_, length ("Date: "));
    my $date = strftime ("%a, %d %b %Y %H:%m:%S",
                         localtime (str2time ($datestr)));
    print "Local-Date: $date\n";

share|improve this answer

set display_filter="/PATH/TO/THIS/PYTHON/FILE" in your .muttrc.

Python 3.3:

#!/usr/bin/env python3
import sys
import re
# import subprocess
from email.utils import format_datetime, parsedate_to_datetime

in_headers = True
for line in sys.stdin.readlines():
    if line == "\n": in_headers = False
    match = re.match(r'^Date: (.+)', line)

    if not in_headers or not match:
        print(line, end="")

    date_string = match.group(1)
    # use this if you do not have python 3.3+
    # converted_date = subprocess.Popen(['date','-d',date_string], stdout=subprocess.PIPE).communicate()[0].strip()
    converted_date = format_datetime(parsedate_to_datetime(date_string).astimezone(tz=None))
    print('Date:', converted_date)
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.