Man page: Add an explanation of columns (RHBZ#834208).
[virt-top.git] / virt-top / virt_top_calendar2.ml
index dd00c79..cc82eec 100755 (executable)
@@ -1,5 +1,5 @@
 (* 'top'-like tool for libvirt domains.
-   (C) Copyright 2007 Richard W.M. Jones, Red Hat Inc.
+   (C) Copyright 2007-2009 Richard W.M. Jones, Red Hat Inc.
    http://libvirt.org/
 
    This program is free software; you can redistribute it and/or modify
@@ -22,7 +22,9 @@
 open CalendarLib
 
 open Printf
-open ExtString ;;
+open ExtString
+
+open Virt_top_gettext.Gettext ;;
 
 Virt_top.parse_date_time :=
 fun time ->
@@ -36,18 +38,31 @@ fun time ->
          Calendar.Period.make 0 0 0 hh mm ss
        ) else                          (* +seconds *)
          Calendar.Period.second (int_of_string period) in
-      (* Add it as an offset from the current time. *)
+      (* Add it as an offset from the current time.
+       *
+       * Note that the default for the Calendar library is to return
+       * Calendar.now in the UTC time zone, which is in fact what we
+       * need below.
+       *)
       Calendar.add (Calendar.now ()) period
     ) else (
-      if String.contains time '-' then (* YYYY-MM-DD HH:MM:SS *)
-       Printer.CalendarPrinter.from_string time
-      else (                           (* HH:MM:SS *)
-       let time = Printer.TimePrinter.from_string time in
-       Calendar.create (Date.today ()) time
-      )
+      let cal =
+        if String.contains time '-' then (* YYYY-MM-DD HH:MM:SS *)
+         Printer.CalendarPrinter.from_string time
+        else (                          (* HH:MM:SS *)
+         let time = Printer.TimePrinter.from_string time in
+         Calendar.create (Date.today ()) time
+        ) in
+      (* Assume the user has entered a local time.  Convert it to
+       * UTC time zone which is what we need below.  (RHBZ#680344)
+       *)
+      Calendar.convert cal Time_Zone.Local Time_Zone.UTC
     ) in
 
-  eprintf "end time: %s\n" (Printer.CalendarPrinter.to_string cal);
+  eprintf "end time (UTC): %s\n" (Printer.CalendarPrinter.to_string cal);
 
-  (* Convert to a time_t, adjusting for the current timezone. *)
-  fst (Unix.mktime (Calendar.to_unixtm cal))
+  (* Convert to a time_t.  Note that we compare this against
+   * Unix.gettimeofday in the main module, so this must be returned as
+   * plain seconds from 1970 with no timezone adjustment.  (RHBZ#637964)
+   *)
+  Calendar.to_unixfloat cal