Changing the time zone and updating the hardware clock
In this recipe we will introduce the concept of TZDATA in order that we can learn how to change a server's time zone and update the hardware clock.
Over the lifetime of your server, the need to change the time and date for one or more users may not happen very often but when it does the process of managing this modification can seem to be quite complicated. You may want to make this change for any number of reasons, you can even use this approach to implement an independent time zone solution for different users, but regardless as to the reason why, it is the purpose of this recipe to illustrate a series of best practices that can be applied to your server and provide you with the solution you need.
Getting ready
To complete this recipe, you will require a working installation of the CentOS 6 operating system with root privileges, a console-based text editor of your choice, and a connection to the Internet to facilitate the download of additional packages.
How to do it...
TZDATA is a compilation of the world's time zone information and we will start this recipe by showing you how to use the tzselect
utility and applying the new time zone setting to a user of your choice.
- To begin, log in as root and type the following command in order to install the necessary
tzdata
package:yum install tzdata
- Now start the
tzselect
utility by typing:tzselect
- Having initiated the
tzselect
utility, you will be asked a series of questions that begins as follows:Please identify a location so that time zone rules can be set correctly.
- From the values shown on screen, choose a numeric value to confirm your selection and press the Return key to proceed.
- You will now be asked the following:
Please select a country.
- This question refers to the preferred time zone, so in a similar manner, choose a numeric value to make your selection and press the Return key to proceed. Based on the information provided, the utility will then respond by asking you to confirm the final details. As an example, for a user located in London (UK), the response will be as follows:
The following information has been given:
Britain (UK)
Therefore TZ='Europe/London' will be used.
Local time is now:Wed May 30 22:21:20 BST 2012.
Universal Time is now:Wed May 30 21:21:20 UTC 2012.
Is the above information OK?
1) Yes
2) No
- Again, choose a numeric value to confirm your settings and press the Return key to proceed. By completing this action, you will now finalize the purpose of the
tzselect
utility, and it will respond in the following way:You can make this change permanent for yourself by appending the line
TZ='Europe/London'; export TZ
to the file '.profile' in your home directory; then log out and log in again.
Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Europe/London
- With reference to the preceding example shown, return to your console and make a note of the following value:
TZ='XXXXXX/XXXXXXX'; export TZ
- Now open the appropriate user profile with your favorite text editor as follows:
vi /home/username/.profile
- Scroll to the bottom of the file and substitute the
TZ
values shown with those values you obtained from thetzselect
utility like this:TZ0 'Europe/Moscow'; export TZ
Note
On the whole, most people will use the location-based method to confirm any preferred time zone settings, but there may be an occasion when you would prefer to use the Posix Time Format. If this is the case, then simply modify the previous command by substituting the following value,
POSIX-format-here with a relative value
, as follows:TZ='POSIX-fomat-here'; export TZ
The value chosen should be a number based on the difference in time between you current location and GMT such as
GMT-5
. - When finished, save and close your file. The relevant user can now re-login and use the
date
command to confirm their new time zone settings at any time:date
- Repeat these given steps for any remaining users on the server.
How it works...
As we have seen, the tzselect
utility can be used to tell you the time (anywhere in the world) by simply looking at your system clock and comparing it with Coordinated Universal Time (UTC). Its purpose is not to complete the task of updating your server's time zone, but it does provide the necessary information that will facilitate such changes for one or more users.
So what have we learned from this experience?
Having started by installing the relevant package, you were then guided to start the tzselect
utility and use the supplied TZ
value to update a user's profile.
Updating a user's profile was simply a matter of amending the appropriate file for each user. In most cases you would update the file found at /home/username/.profile
. However, if this file was not available, then an alternative option located at /home/username/.bash_profile
can be used.
For example, a revised bash profile will look like this:
# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH TZ='Europe/Moscow'; export TZ
You were also shown how to use the Posix Time Format, and if you did indeed decide to use this variation, then your revised bash profile will look like this:
# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH TZ='GMT-5'; export TZ
Remember, in the context of this recipe, the measurement of time is session based, so having made the preceding modifications, a user would then be required to re-login before they will notice any changes. They can do this by typing the following command:
date
Moreover, it is important to note that a change to a specific profile will not affect another user and none of these changes will affect the server as a whole. So with this in mind, this recipe can be used to enable multiple users to maintain different clocks.
So having completed this recipe, we can say that we now know how to obtain the required TZ
value and provide a unique time zone setting for each user. As previously stated, it may not be a feature that you use on a regular basis, but it does provide a flexible solution in as much that you are now able you to configure a user account independently of the system as a whole and deliver a fully localized server environment regardless of how many users you serve or where they are located.
There's more...
Setting the time for your users is only one aspect of managing time on a server and it should not be forgotten that your server will run two clocks—a hardware-based clock that is supported by the battery on the motherboard and a secondary clock that is maintained by the operating system. Where the former is used to set the system clock during the boot process, the latter will be the clock that is used to keep a track of time.
Both of these time values can be run independently of each other (local time versus UTC) and on occasion this may even prove to be useful when considering a dual-boot situation. However, and in the case of most servers, it is common practice to ensure that both the hardware clock and system clock use the same reference in order to account for daylight.
As the root user you can use the following syntax to set a new date and time for your server's operating system by simply replacing MMDDhhmmYYYY.ss
(Month, Day, Hour, Minute, Year, and seconds) with the correct values:
date MMDDhhmmYYYY.ss
For example, to change the time and date value to May 17, 13:21:22, 2012
, you can use the following syntax:
date 051713212012.22
When ready, you should now synchronize the system with your hardware clock by typing:
hwclock–systohc
Finally, reboot your server to finalize the changes made:
reboot
On a successful reboot, you can confirm the status of your hardware clock with the following command:
hwclock–show
Similarly you can view the current operating system date and time by typing the following command:
date
As many of the applications and features running on your server will use the current clock to determine the correct time, having completed the preceding steps it is often a good idea to ensure if the correct time zone information is linked to your server's local time settings.
To do this simply, log in as root, and remove the old location values by typing:
rm /etc/localtime
Confirm the request and then by referring to the list of files located in /usr/share/zoneinfo
, create the following symbolic link by replacing XXX
with a value more representative of your location:
ln -sf /usr/share/zoneinfo/XXX /etc/localtime
Finally, you should reboot your server to allow any changes to take immediate effect:
reboot