120

How to change the system date in Linux ?

I want to change:

  • Only Year
  • Only Month
  • Only Date
  • Any combination of above three
SHW
  • 14,786
  • 14
  • 66
  • 101
  • 4
    You can use e.g. date --set='-2 years' to set the clock back two years, leaving all other elements identical. You can change month and day of month the same way. I haven't checked what happens if that calculation results in a datetime that doesn't actually exist, e.g. during a DST switchover, but the behaviour ought to be identical to the usual "set both date and time to concrete values" behaviour. – Christian Severin Sep 29 '17 at 09:47
  • Assuming you're trying to set the date to the current time, you could do sudo ntpd -gq to have the system update automatically using the ntp service. – Steven Soroka Mar 23 '18 at 21:20

7 Answers7

153

Use date -s:

date -s '2014-12-25 12:34:56'

Run that as root or under sudo. Changing only one of the year/month/day is more of a challenge and will involve repeating bits of the current date. There are also GUI date tools built in to the major desktop environments, usually accessed through the clock.

To change only part of the time, you can use command substitution in the date string:

date -s "2014-12-25 $(date +%H:%M:%S)"

will change the date, but keep the time. See man date for formatting details to construct other combinations: the individual components are %Y, %m, %d, %H, %M, and %S.

Michael Homer
  • 76,565
  • I don't want to change the time – SHW Aug 22 '14 at 09:51
  • 7
    There's no option to do that. You can use date -s "2014-12-25 $(date +%H:%M:%S)" to change the date and reuse the current time, though. – Michael Homer Aug 22 '14 at 09:55
  • came here and hours as well as minutes were matching current time. – nice – Alex2php Mar 30 '18 at 10:36
  • 3
    date: cannot set date: Invalid argument – Chris Stryczynski Aug 02 '18 at 16:17
  • @MichaelHomer @SHW it is possible to change only the date with a command like date -s 2018-01-01. Someone shared this in an answer also: https://superuser.com/questions/870068/how-to-set-system-time-on-kali-linux#1162962 – baptx Oct 04 '18 at 14:15
  • @baptx On the assumption that it is exactly midnight, yes. – Michael Homer Oct 04 '18 at 19:18
  • I try to change but its not changing:- $ sudo date --set="2015-09-30 10:05:59.990" Wed Sep 30 10:05:59 +0530 2015 $ date Thu May 23 15:10:37 +0530 2019 – Vinod May 23 '19 at 09:45
  • @MichaelHomer about date -s "2014-12-25 $(date +%H:%M:%S)" seems a contradiction about the answer vs comment indicate. Consider to update your answer, seems is correct the comment's content. So this 'contradiction' makes confuse the second part of your answer – Manuel Jordan Apr 13 '21 at 22:11
  • @ManuelJordan I don't know what update you're suggesting. – Michael Homer Apr 13 '21 at 22:15
  • @MichaelHomer date -s "2014-12-25 $(date +%H:%M:%S)" about in your comment updates only the date and reuses the time, right? but in the answer seems the inverse because says/indicates To change only part of the time, you can use command substitution in the date string: ... there the possible contradiction – Manuel Jordan Apr 13 '21 at 23:21
60

System time

You can use date to set the system date. The GNU implementation of date (as found on most non-embedded Linux-based systems) accepts many different formats to set the time, here a few examples:

set only the year:

date -s 'next year'
date -s 'last year'

set only the month:

date -s 'last month'
date -s 'next month'

set only the day:

date -s 'next day'
date -s 'tomorrow'
date -s 'last day'
date -s 'yesterday'
date -s 'friday'

set all together:

date -s '2009-02-13 11:31:30' #that's a magical timestamp

Hardware time

Now the system time is set, but you may want to sync it with the hardware clock:

Use --show to print the hardware time:

hwclock --show

You can set the hardware clock to the current system time:

hwclock --hctosys

Or the system time to the hardware clock

hwclock --systohc
chaos
  • 48,171
  • 3
    Bonus points for illustrating the non-obvious ways you can set the date with examples and for pointing out the difference between the "system time" and the "hardware clock". Very helpful answer! – Mark Edington Oct 06 '16 at 02:17
  • I think you confused hctosys and systohc. hctosys means "Set system time from hardware clock" and systohc means "Set hardware clock from system time". – itaych Apr 12 '22 at 09:45
10

The command to to change the system date is date.

There are two ways to call the date command(in Linux):

   date [OPTION]... [+FORMAT]
   date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

Easy

The easiest way is to use date -s as it allows the use of simple relative dates

 $ date -s yesterday; date
 date: cannot set date: Operation not permitted
 Sat Jan  5 07:21:07 EST 2019
 Sun Jan  6 07:21:07 EST 2019

The date did not change because it was executed with a limited user $. If you actually want the date changed, use root (#) or sudo:

 $ sudo date -s yesterday; date
 Sat Jan  5 07:21:07 EST 2019
 Sat Jan  5 07:21:07 EST 2019

So, changing any part of a relative date is as easy as naming it:

 $ date -s "5 years ago"
 Mon Jan  6 08:26:26 EST 2014

 $ date -s "+6 months"
 Sat Jul  6 08:28:39 EDT 2019

 $ date -s "+3 hours -13 minutes"
 Sun Jan  6 11:16:59 AST 2019

Absolute dates are a bit more complex as they need more detail:

 $ date -s "2001-07-23 10:11:12"

Or, you can use the date command twice:

 $ date -s "$(date +'%Y-%m-%d %H:%M:%S')"

replace any of the % by a valid value and the date will be set (only as root).

 $ date -s "$(date +'%Y-11-%d %H:%M:%S')"
 Wed Nov  6 08:37:15 EST 2019

direct

The second date call form is used to directly change the system date.

 date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

So :

 date 11230812              # MMDDhhmm

Will set the date to the 23th of November at 08h and 12min.

BSD has a similar command but a different format ([[[[[cc]yy]mm]dd]HH]MM[.ss]).

Try date as a limited user to see what it would do (without changing anything):

 $ date 11230812
 date: cannot set date: Operation not permitted
 Sat Nov 23 08:12:00 EST 2019

Or, if you actually want to change the date, as root:

 # date 11230812
 # date
 Sat Nov 23 08:12:00 EST 2019

Note that services like NTP or chrony will be affected. And, if restarted will reset the date back to the real one.

Add a YY to set the year:

 $ date 1123081222
 date: cannot set date: Operation not permitted
 Wed Nov 23 08:12:00 EST 2022

Or a CCYY to set year and century:

 $ date 112308121982
 date: cannot set date: Operation not permitted
 Tue Nov 23 08:12:00 EST 1982
5

You change the date with the date command. However, the command expects a full date as the argument:

# date -s "20141022 09:45"
Wed Oct 22 09:45:00 BST 2014

To change part of the date, output the current date with the date part that you want to change as a string and all others as date formatting variables. Then pass that to the date -s command to set it:

# date -s "$(date +'%Y12%d %H:%M')"
Mon Dec 22 10:55:03 GMT 2014

changes the month to the 12th month - December.

The date formats are:

  • %Y - Year
  • %m - Month
  • %d - Day
  • %H - Hour
  • %M - Minute
garethTheRed
  • 33,957
  • I try to change but its not changing:- $ sudo date --set="2015-09-30 10:05:59.990" Wed Sep 30 10:05:59 +0530 2015 $ date Thu May 23 15:10:37 +0530 2019 – Vinod May 23 '19 at 09:58
3

As of December 2022:

You may disable NTP sync before actual date change:

sudo timedatectl set-ntp 0
sudo timedatectl set-time "2022-12-03 $(date +%H:%M:%S)"

When date modification is no longer necessary, you should enable NTP sync again to auto update system date:

sudo timedatectl set-ntp 1
  • This applies only to installations that use systemd. Also, once you turn off ntp, you can still just use the date command to set the date if needed (depending on the purpose). – éclairevoyant Feb 17 '23 at 23:07
  • 2
    This saved me some time while debugging issues in Ubuntu 22.04. Thank you! – Machado Mar 20 '23 at 18:48
2

For ones like me running ESXI 5.1, here's what the system answered me

~ # date -s "2016-03-23 09:56:00"
date: invalid date '2016-03-23 09:56:00'

I had to uses a specific ESX command instead :

esxcli system time set  -y 2016 -M 03 -d 23  -H 10 -m 05 -s 00
Rui F Ribeiro
  • 56,709
  • 26
  • 150
  • 232
Balmipour
  • 199
  • 4
    Thanks for the -1, but would you mind explaining why ? If you got a better/more complete/more exact answer, feel free to comment. – Balmipour Jul 06 '17 at 13:34
-2

I used the date command and time format listed below to successfully set the date from the terminal shell command performed on Android Things which uses the Linux Kernal.

date 092615002017.00

MMDDHHMMYYYY.SS

MM - Month - 09

DD - Day - 26

HH - Hour - 15

MM - Min - 00

YYYY - Year - 2017

.SS - second - 00

  • 1
    Since this does not work with either GNU or BSD date, could you please add more info about what system this is relevant for and how it's relevant to this particular question. – Kusalananda Sep 26 '17 at 21:07