Ruby: Contacting a timeserver
August 26, 2006The TIME protocol is an internet protocol defined in http://www.faqs.org/rfcs/rfc868.htmlThis script shows how to connect to an arbitrary TIME-Server using Ruby's Net::Telnet library.
require 'net/telnet'
TIME_SERVER = 'ntp2.fau.de'
options = {
"Host" => TIME_SERVER,
"Telnetmode" => false,
"Timeout" => 30,
"Port" => "time"
}
# The time is the number of seconds since 00:00 (midnight) 1 January 1900
# GMT, such that the time 1 is 12:00:01 am on 1 January 1900 GMT; this
# base will serve until the year 2036.
seconds = Net::Telnet.new(options).recv(4).unpack('N').first
# The Ruby Time class handles dates with an epoch
# starting at midnight january 1 1970
# We have to use the Date class to work with pre-epoch dates.
require 'date'
def get_seconds_diff_1970_1900
# you might want to cache the Cache result... it won't change ;-)
(DateTime.new(1970, 1, 1) - DateTime.new(1900, 1, 1)).to_i * 24 * 60 * 60
end
# Convert seconds to a Time object
remote_time = Time.at(seconds - \
get_seconds_diff_1970_1900).strftime("%Y-%m-%d %H:%M:%S")
print "Time from #{TIME_SERVER} -> #{remote_time}"
- http://attachr.com/3911
- TIME protocol
- www.ntp.org
- http://ntp.isc.org/bin/view/Servers/WebHome
- Wikipedia: Network Time Protocol
- Net::Telnet
- RFC 958
- Ruby Date
Kudos to Peter Cooper who pointed out that we are using the TIME protocol (TCP on port 37) not NTP on UDP port 123!