File 2581-stdlib-Add-system-time-functions-to-module-calendar.patch of Package erlang

From 83515e39e7c321910082fa3ef8a06a659c51f70a Mon Sep 17 00:00:00 2001
From: Hans Bolinder <hasse@erlang.org>
Date: Thu, 22 Feb 2018 13:33:40 +0100
Subject: [PATCH] stdlib: Add system time functions to module calendar

---
 lib/stdlib/doc/src/calendar.xml    | 18 +++++++++++++++++-
 lib/stdlib/src/calendar.erl        | 23 +++++++++++++++++++++--
 lib/stdlib/test/calendar_SUITE.erl | 24 +++++++++++++++++++++---
 3 files changed, 59 insertions(+), 6 deletions(-)

diff --git a/lib/stdlib/doc/src/calendar.xml b/lib/stdlib/doc/src/calendar.xml
index 65b3edcdf6..0c4a30ce16 100644
--- a/lib/stdlib/doc/src/calendar.xml
+++ b/lib/stdlib/doc/src/calendar.xml
@@ -4,7 +4,7 @@
 <erlref>
   <header>
     <copyright>
-      <year>1996</year><year>2016</year>
+      <year>1996</year><year>2018</year>
       <holder>Ericsson AB. All Rights Reserved.</holder>
     </copyright>
     <legalnotice>
@@ -338,6 +338,22 @@
       </desc>
     </func>
 
+    <func>
+      <name name="system_time_to_local_time" arity="2"/>
+      <fsummary>Convert system time to local date and time.</fsummary>
+      <desc>
+	<p>Converts a specified system time into local date and time.</p>
+      </desc>
+    </func>
+
+    <func>
+      <name name="system_time_to_universal_time" arity="2"/>
+      <fsummary>Convert system time to universal date and time.</fsummary>
+      <desc>
+	<p>Converts a specified system time into universal date and time.</p>
+      </desc>
+    </func>
+
     <func>
       <name name="time_difference" arity="2"/>
       <fsummary>Compute the difference between two times (deprecated).
diff --git a/lib/stdlib/src/calendar.erl b/lib/stdlib/src/calendar.erl
index 55a0cfc9a1..2e24e8c133 100644
--- a/lib/stdlib/src/calendar.erl
+++ b/lib/stdlib/src/calendar.erl
@@ -1,7 +1,7 @@
 %%
 %% %CopyrightBegin%
 %% 
-%% Copyright Ericsson AB 1996-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2018. All Rights Reserved.
 %% 
 %% Licensed under the Apache License, Version 2.0 (the "License");
 %% you may not use this file except in compliance with the License.
@@ -41,6 +41,8 @@
 	 now_to_universal_time/1,
 	 seconds_to_daystime/1,
 	 seconds_to_time/1,
+         system_time_to_local_time/2,
+         system_time_to_universal_time/2,
 	 time_difference/2,
 	 time_to_seconds/1,
 	 universal_time/0,
@@ -59,6 +61,7 @@
 -define(DAYS_PER_100YEARS, 36524).
 -define(DAYS_PER_400YEARS, 146097).
 -define(DAYS_FROM_0_TO_1970, 719528).
+-define(SECONDS_FROM_0_TO_1970, (?DAYS_FROM_0_TO_1970*?SECONDS_PER_DAY)).
 
 %%----------------------------------------------------------------------
 %% Types
@@ -309,7 +312,7 @@ local_time_to_universal_time_dst(DateTime) ->
 -spec now_to_datetime(Now) -> datetime1970() when
       Now :: erlang:timestamp().
 now_to_datetime({MSec, Sec, _uSec}) ->
-    Sec0 = MSec*1000000 + Sec + ?DAYS_FROM_0_TO_1970*?SECONDS_PER_DAY,
+    Sec0 = MSec*1000000 + Sec + ?SECONDS_FROM_0_TO_1970,
     gregorian_seconds_to_datetime(Sec0).
 
 -spec now_to_universal_time(Now) -> datetime1970() when
@@ -363,6 +366,22 @@ seconds_to_time(Secs) when Secs >= 0, Secs < ?SECONDS_PER_DAY ->
     Second =  Secs1 rem ?SECONDS_PER_MINUTE,
     {Hour, Minute, Second}.
 
+-spec system_time_to_local_time(Time, TimeUnit) -> datetime() when
+      Time :: integer(),
+      TimeUnit :: erlang:time_unit().
+
+system_time_to_local_time(Time, TimeUnit) ->
+    UniversalDate = system_time_to_universal_time(Time, TimeUnit),
+    erlang:universaltime_to_localtime(UniversalDate).
+
+-spec system_time_to_universal_time(Time, TimeUnit) -> datetime() when
+      Time :: integer(),
+      TimeUnit :: erlang:time_unit().
+
+system_time_to_universal_time(Time, TimeUnit) ->
+    Secs = erlang:convert_time_unit(Time, TimeUnit, second),
+    gregorian_seconds_to_datetime(Secs + ?SECONDS_FROM_0_TO_1970).
+
 %% time_difference(T1, T2) = Tdiff
 %%
 %% Returns the difference between two {Date, Time} structures.
diff --git a/lib/stdlib/test/calendar_SUITE.erl b/lib/stdlib/test/calendar_SUITE.erl
index 20053dfe54..52c3cc68eb 100644
--- a/lib/stdlib/test/calendar_SUITE.erl
+++ b/lib/stdlib/test/calendar_SUITE.erl
@@ -1,7 +1,7 @@
 %%
 %% %CopyrightBegin%
 %%
-%% Copyright Ericsson AB 1997-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2018. All Rights Reserved.
 %%
 %% Licensed under the Apache License, Version 2.0 (the "License");
 %% you may not use this file except in compliance with the License.
@@ -30,7 +30,8 @@
 	 leap_years/1,
 	 last_day_of_the_month/1,
 	 local_time_to_universal_time_dst/1,
-	 iso_week_number/1]).
+	 iso_week_number/1,
+         system_time/1]).
 
 -define(START_YEAR, 1947).			
 -define(END_YEAR, 2012).
@@ -40,7 +41,8 @@ suite() -> [{ct_hooks,[ts_install_cth]}].
 all() -> 
     [gregorian_days, gregorian_seconds, day_of_the_week,
      day_of_the_week_calibrate, leap_years,
-     last_day_of_the_month, local_time_to_universal_time_dst, iso_week_number].
+     last_day_of_the_month, local_time_to_universal_time_dst,
+     iso_week_number, system_time].
 
 groups() -> 
     [].
@@ -157,6 +159,22 @@ local_time_to_universal_time_dst_x(Config) when is_list(Config) ->
 iso_week_number(Config) when is_list(Config) ->
     check_iso_week_number().
 
+system_time(Config) when is_list(Config) ->
+    EpochDate = {{1970,1,1}, {0,0,0}},
+    Epoch = calendar:datetime_to_gregorian_seconds(EpochDate),
+    Y0 = {{0,1,1},{0,0,0}},
+
+    EpochDate = calendar:system_time_to_universal_time(0, second),
+    0 = calendar:datetime_to_gregorian_seconds(Y0),
+    Y0 = calendar:system_time_to_universal_time(-Epoch, second),
+
+    T = erlang:system_time(second),
+    UDate = calendar:system_time_to_universal_time(T, second),
+    LDate = erlang:universaltime_to_localtime(UDate),
+    LDate = calendar:system_time_to_local_time(T, second),
+
+    ok.
+
 %%
 %% LOCAL FUNCTIONS
 %%
-- 
2.16.3

openSUSE Build Service is sponsored by