Получить ближайшее время в списке ко времени суток в текущей временной метке Unix C#

#c# #unix-timestamp

#c# #unix-временная метка

Вопрос:

У меня есть список временных меток Unix за 20 октября 2018 года, который выглядит примерно так

Время временной метки Unix преобразовано

  • 1539993951 20.10.2018 в 12:05 (UTC)
  • 1539997544, 20.10.2018, 1:05 (UTC)
  • 1540001143 20.10.2018 в 14:05 (UTC)
  • 1540004743 20.10.2018 в 3:05 утра (UTC)
  • 1540008353 20.10.2018 в 4:05 утра (UTC)
  • 1540011941, 20.10.2018, 5:05 утра (UTC)
  • 1540015547 — 20.10.2018 в 6:05 утра (UTC)
  • 1540019148 20.10.2018 в 7:05 утра (UTC)
  • 1540022753 20.10.2018 в 8:05 утра (UTC)
  • 1540026346 20.10.2018 в 9:05 утра (UTC)
  • 1540029951 — 20.10.2018 в 10:05 утра (UTC)
  • 1540033550 20.10.2018 в 11:05 (UTC)
  • 1540037150 20.10.2018 в 12:05 (UTC)
  • 1540040746 20.10.2018 в 13:05 (UTC)
  • 1540044347 20.10.2018 в 14:05 (UTC)
  • 1540047951, 20.10.2018, 15:05 (UTC)
  • 1540051549 20.10.2018 в 16:05 (UTC)
  • 1540055144 20.10.2018 в 17:05 (UTC)
  • 1540058750 20.10.2018 в 18:05 (UTC)
  • 1540062349 20.10.2018 в 19:05 (UTC)
  • 1540065938, 20.10.2018, 20:05 (UTC)
  • 1540069549 20.10.2018 в 21:05 (UTC)
  • 1540073134 20.10.2018 в 10:05 вечера (UTC)
  • 1540076744 20.10.2018 в 11:05 (UTC)

У меня есть способ получить временную метку Unix для текущего времени

         public static Int32 unixTimeStampNow()
        {
            Int32 unixTimestamp = (Int32)(DateTime.Now.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
            Console.WriteLine("The Unix Timestamp is ", unixTimestamp);
            return unixTimestamp;
        }
  

Текущая временная метка:
1596893776 08.08.2020 в 13:45 (UTC)

Если бы я хотел найти ближайшую временную метку ко времени суток из текущей временной метки (1: 45 вечера), которая была бы (1540044347 — 20.10.2018 @ 2: 05 вечера (UTC)) в приведенном выше списке. Как я мог бы это сделать? Заранее благодарен за любую помощь!

Комментарии:

1. Почему вы вообще это делаете вместо того, чтобы использовать DateTime? Вы ничего от этого не выиграете, но действительно потеряете индикатор местного времени — DateTime.Now возвращает местное время. Вы также теряете данные — доли секунды

2. Если вы хотите найти точку ‘closes’ для некоторого произвольного DateTime, вы можете упорядочить все экземпляры DateTime и найти значение ‘Min`, большее его, значение прямо перед ним и проверить, какое из них ближе всего. Вы можете сделать это с помощью запроса LINQ. Или вы можете вычесть целевую дату-время из всех сохраненных значений и выбрать наименьшую абсолютную разницу. Вы можете сделать то же самое только с временными метками. но это повлекло бы за собой дополнительные затраты на преобразование.

Ответ №1:

Вы могли бы поместить преобразованную временную метку unix в массив, а затем использовать что-то вроде Array.Exists public static bool Exists<T&&t; (T[] array, Predicate<T&&t; match); Я не знаю весь код наизусть, но вот пример того, как я бы сделал что-то подобное, где ‘planets’ по сути были бы вашими временными метками:

 namespace Example
{
    class Pro&ram
    {
        static void Main(strin&[] ar&s)
        {
            strin&[] planets = { "Mercury", "Venus",
                "Earth", "Mars", "Jupiter",
                "Saturn", "Uranus", "Neptune" };

            Console.WriteLine("One or more planets contain 'M': {0}",
                Array.Exists(planets, element =&&t; element.Contains("M")));

            Console.WriteLine("One or more planets contain 'T': {0}",
                Array.Exists(planets, element =&&t; element.Contains("T")));

            Console.WriteLine("Is Pluto one of the planets? {0}",
                Array.Contains(planets, element =&&t; element == "Pluto"));
        }
    }
}