From edce497a0d48ba25a8b5a5373c4eec2a85b4a4a7 Mon Sep 17 00:00:00 2001
From: Claudio Heckler <claudio.andre@heckler.com.br>
Date: Mon, 23 Dec 2019 17:48:24 -0300
Subject: [PATCH] New date_time_utc display option added to the time_date
 sensor platform (#30158)

---
 homeassistant/components/time_date/sensor.py |  6 ++-
 tests/components/time_date/test_sensor.py    | 49 +++++++++++++++++++-
 2 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/homeassistant/components/time_date/sensor.py b/homeassistant/components/time_date/sensor.py
index 9edbdd3a9a1..1deb564133e 100644
--- a/homeassistant/components/time_date/sensor.py
+++ b/homeassistant/components/time_date/sensor.py
@@ -20,7 +20,8 @@ OPTION_TYPES = {
     "time": "Time",
     "date": "Date",
     "date_time": "Date & Time",
-    "date_time_iso": "Date & Time ISO",
+    "date_time_utc": "Date & Time (UTC)",
+    "date_time_iso": "Date & Time (ISO)",
     "time_date": "Time & Date",
     "beat": "Internet Time",
     "time_utc": "Time (UTC)",
@@ -102,6 +103,7 @@ class TimeDateSensor(Entity):
         time = dt_util.as_local(time_date).strftime(TIME_STR_FORMAT)
         time_utc = time_date.strftime(TIME_STR_FORMAT)
         date = dt_util.as_local(time_date).date().isoformat()
+        date_utc = time_date.date().isoformat()
 
         # Calculate Swatch Internet Time.
         time_bmt = time_date + timedelta(hours=1)
@@ -119,6 +121,8 @@ class TimeDateSensor(Entity):
             self._state = date
         elif self.type == "date_time":
             self._state = f"{date}, {time}"
+        elif self.type == "date_time_utc":
+            self._state = f"{date_utc}, {time_utc}"
         elif self.type == "time_date":
             self._state = f"{time}, {date}"
         elif self.type == "time_utc":
diff --git a/tests/components/time_date/test_sensor.py b/tests/components/time_date/test_sensor.py
index cdd3bd7e9f3..2aae99f93a5 100644
--- a/tests/components/time_date/test_sensor.py
+++ b/tests/components/time_date/test_sensor.py
@@ -1,4 +1,4 @@
-"""The tests for Kira sensor platform."""
+"""The tests for time_date sensor platform."""
 import unittest
 from unittest.mock import patch
 
@@ -9,7 +9,7 @@ from tests.common import get_test_home_assistant
 
 
 class TestTimeDateSensor(unittest.TestCase):
-    """Tests the Kira Sensor platform."""
+    """Tests the time_date Sensor platform."""
 
     # pylint: disable=invalid-name
     DEVICES = []
@@ -67,6 +67,14 @@ class TestTimeDateSensor(unittest.TestCase):
         device._update_internal_state(now)
         assert device.state == "00:54"
 
+        device = time_date.TimeDateSensor(self.hass, "date_time")
+        device._update_internal_state(now)
+        assert device.state == "2017-05-18, 00:54"
+
+        device = time_date.TimeDateSensor(self.hass, "date_time_utc")
+        device._update_internal_state(now)
+        assert device.state == "2017-05-18, 00:54"
+
         device = time_date.TimeDateSensor(self.hass, "beat")
         device._update_internal_state(now)
         assert device.state == "@079"
@@ -75,6 +83,41 @@ class TestTimeDateSensor(unittest.TestCase):
         device._update_internal_state(now)
         assert device.state == "2017-05-18T00:54:00"
 
+    def test_states_non_default_timezone(self):
+        """Test states of sensors in a timezone other than UTC."""
+        new_tz = dt_util.get_time_zone("America/New_York")
+        assert new_tz is not None
+        dt_util.set_default_time_zone(new_tz)
+
+        now = dt_util.utc_from_timestamp(1495068856)
+        device = time_date.TimeDateSensor(self.hass, "time")
+        device._update_internal_state(now)
+        assert device.state == "20:54"
+
+        device = time_date.TimeDateSensor(self.hass, "date")
+        device._update_internal_state(now)
+        assert device.state == "2017-05-17"
+
+        device = time_date.TimeDateSensor(self.hass, "time_utc")
+        device._update_internal_state(now)
+        assert device.state == "00:54"
+
+        device = time_date.TimeDateSensor(self.hass, "date_time")
+        device._update_internal_state(now)
+        assert device.state == "2017-05-17, 20:54"
+
+        device = time_date.TimeDateSensor(self.hass, "date_time_utc")
+        device._update_internal_state(now)
+        assert device.state == "2017-05-18, 00:54"
+
+        device = time_date.TimeDateSensor(self.hass, "beat")
+        device._update_internal_state(now)
+        assert device.state == "@079"
+
+        device = time_date.TimeDateSensor(self.hass, "date_time_iso")
+        device._update_internal_state(now)
+        assert device.state == "2017-05-17T20:54:00"
+
     # pylint: disable=no-member
     def test_timezone_intervals(self):
         """Test date sensor behavior in a timezone besides UTC."""
@@ -122,5 +165,7 @@ class TestTimeDateSensor(unittest.TestCase):
         assert device.icon == "mdi:calendar"
         device = time_date.TimeDateSensor(self.hass, "date_time")
         assert device.icon == "mdi:calendar-clock"
+        device = time_date.TimeDateSensor(self.hass, "date_time_utc")
+        assert device.icon == "mdi:calendar-clock"
         device = time_date.TimeDateSensor(self.hass, "date_time_iso")
         assert device.icon == "mdi:calendar-clock"
-- 
GitLab