Работа с датами и временем
Для работы с датами и временем в .NET предназначена структура DateTime . Она представляет дату и время от 00:00:00 1 января 0001 года до 23:59:59 31 декабря 9999 года.
Для создания нового объекта DateTime также можно использовать конструктор. Пустой конструктор создает начальную дату:
DateTime dateTime = new DateTime(); Console.WriteLine(dateTime); // 01.01.0001 0:00:00
То есть мы получим минимально возможное значение, которое также можно получить следующим образом:
Console.WriteLine(DateTime.MinValue);
Чтобы задать конкретную дату, нужно использовать один из конструкторов, принимающих параметры:
DateTime date1 = new DateTime(2015, 7, 20); // год - месяц - день Console.WriteLine(date1); // 20.07.2015 0:00:00
DateTime date1 = new DateTime(2015, 7, 20, 18, 30, 25); // год - месяц - день - час - минута - секунда Console.WriteLine(date1); // 20.07.2015 18:30:25
Если необходимо получить текущую время и дату, то можно использовать ряд свойств DateTime:
Console.WriteLine(DateTime.Now); Console.WriteLine(DateTime.UtcNow); Console.WriteLine(DateTime.Today);
20.07.2015 11:43:33 20.07.2015 8:43:33 20.07.2015 0:00:00
Свойство DateTime.Now берет текущую дату и время компьютера, DateTime.UtcNow — дата и время относительно времени по Гринвичу (GMT) и DateTime.Today — только текущая дата.
При работе с датами надо учитывать, что по умолчанию для представления дат применяется григорианский календарь. Но что будет, если мы захотим получить день недели для 5 октября 1582 года:
DateTime someDate = new DateTime(1582, 10, 5); Console.WriteLine(someDate.DayOfWeek);
Консоль высветит значение Tuesday, то есть вторник. Однако, как может быть известно из истории, впервые переход с юлианского календаря на григорианский состоялся в октябре 1582 года. Тогда после даты 4 октября (четверг) (еще по юлианскому календарю) сразу перешли к 15 октября (пятница)(уже по григорианскому календарю). Таким образом, фактически выкинули 10 дней. То есть после 4 октября шло 15 октября.
В большинстве случаев данный факт вряд ли как-то повлияет на вычисления, однако при работе с очень давними датами данный аспект следует учитывать.
Операции с DateTime
Основные операции со структурой DateTime связаны со сложением или вычитанием дат. Например, надо к некоторой дате прибавить или, наоборот, отнять несколько дней.
Для добавления дат используется ряд методов:
- Add(TimeSpan value) : добавляет к дате значение TimeSpan
- AddDays(double value) : добавляет к текущей дате несколько дней
- AddHours(double value) : добавляет к текущей дате несколько часов
- AddMinutes(double value) : добавляет к текущей дате несколько минут
- AddMonths(int value) : добавляет к текущей дате несколько месяцев
- AddYears(int value) : добавляет к текущей дате несколько лет
Например, добавим к некоторой дате 3 часа:
DateTime date1 = new DateTime(2015, 7, 20, 18, 30, 25); // 20.07.2015 18:30:25 Console.WriteLine(date1.AddHours(3)); // 20.07.2015 21:30:25
Для вычитания дат используется метод Subtract(DateTime date) :
DateTime date1 = new DateTime(2015, 7, 20, 18, 30, 25); // 20.07.2015 18:30:25 DateTime date2 = new DateTime(2015, 7, 20, 15, 30, 25); // 20.07.2015 15:30:25 Console.WriteLine(date1.Subtract(date2)); // 03:00:00
Здесь даты различаются на три часа, поэтому результатом будет дата «03:00:00».
Метод Substract не имеет возможностей для отдельного вычитания дней, часов и так далее. Но это и не надо, так как мы можем передавать в метод AddDays() и другие методы добавления отрицательные значения:
// вычтем три часа DateTime date1 = new DateTime(2015, 7, 20, 18, 30, 25); // 20.07.2015 18:30:25 Console.WriteLine(date1.AddHours(-3)); // 20.07.2015 15:30:25
Кроме операций сложения и вычитания еще есть ряд методов форматирования дат:
DateTime date1 = new DateTime(2015, 7, 20, 18, 30, 25); Console.WriteLine(date1.ToLocalTime()); // 20.07.2015 21:30:25 Console.WriteLine(date1.ToUniversalTime()); // 20.07.2015 15:30:25 Console.WriteLine(date1.ToLongDateString()); // 20 июля 2015 г. Console.WriteLine(date1.ToShortDateString()); // 20.07.2015 Console.WriteLine(date1.ToLongTimeString()); // 18:30:25 Console.WriteLine(date1.ToShortTimeString()); // 18:30
Метод ToLocalTime() преобразует время UTC в локальное время, добавляя смещение относительно времени по Гринвичу. Метод ToUniversalTime() , наоборот, преобразует локальное время во время UTC, то есть вычитает смещение относительно времени по Гринвичу. Остальные методы преобразуют дату к определенному формату.
Как преобразовать значения ключей из int в datetime?
Не могу понять почему преобразовываются не все значения в словаре.
import datetime dat = today = datetime.date.today() for i in dat: if isinstance(i, datetime.date): # условие сравнения классов continue else : tod = today + datetime.timedelta(days=i) dat[tod] = dat.pop(i) print(dat)
- Вопрос задан более двух лет назад
- 178 просмотров
1 комментарий
Простой 1 комментарий
DateTime to int c#
Вы можете перевести текущее время в секунды или миллисекунды. Общепринятая дата отсчёта при этом является 00:00:00 01.01.1970 по UTC.
DateTime dt = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now); DateTime dt1970 = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); TimeSpan tsInterval = dt.Subtract(dt1970); Int32 iSeconds = Convert.ToInt32(tsInterval .TotalSeconds); Int64 iMilliseconds = Convert.ToInt64(tsInterval .TotalMilliseconds);
Отслеживать
25.1k 4 4 золотых знака 45 45 серебряных знаков 81 81 бронзовый знак
ответ дан 7 апр 2015 в 14:04
Пётр Сокольников Пётр Сокольников
21 3 3 бронзовых знака
Отслеживать
ответ дан 15 дек 2011 в 22:21
612 4 4 серебряных знака 12 12 бронзовых знаков
Если устраивает точность до секунд и диапазон дат +- примерно 68 лет от 2017, то работает это решение. По необходимости можно двигать диапазон дат, меняя в коде цифру 2017 на требуемую. На всякий случай обращаю внимание, что ConvertDateTimeToInt32 по-хорошему нуждается в некой логике обработки ошибок. Сейчас при выходе даты за границу рабочего диапазона, вернет неверное значение без генерации исключения.
using System; namespace ConsoleApplication1 < class Program < static void Main(string[] args) < int now = ConvertDateTimeToInt32(DateTime.Now); Console.WriteLine("Сейчас " + ConvertInt32ToDateTime(now)); Console.WriteLine("Диапазон от " + ConvertInt32ToDateTime(int.MinValue)); Console.WriteLine("Диапазон до " + ConvertInt32ToDateTime(int.MaxValue)); int error = ConvertDateTimeToInt32(DateTime.MaxValue); Console.WriteLine("Error: вместо " + DateTime.MaxValue + " выдает " + ConvertInt32ToDateTime(error)); Console.ReadLine(); >public static int ConvertDateTimeToInt32(DateTime dt) < return (int)(dt - new DateTime(2017, 1, 1)).TotalSeconds; >public static DateTime ConvertInt32ToDateTime(int i) < return new DateTime(2017, 1, 1).AddSeconds(i); >> >
Отслеживать
ответ дан 14 окт 2017 в 10:30
11 2 2 бронзовых знака
Нельзя преобразовать в данный тип. Можно только в String. Как ты собираешься преобразовывать точки в Int32? Это невозможно.
Отслеживать
ответ дан 15 дек 2011 в 15:15
690 7 7 золотых знаков 21 21 серебряный знак 51 51 бронзовый знак
Я уже решил вопрос, это делается вот так: TimeSpan t = (new DateTime.Now — new DateTime(1970, 1, 1, 0, 0, 0)); int data = (int)(t.TotalDays * 86400); И поверь это возможно 🙂
Как перевести дату время в значение типа int? — страница 2
Я не знаю C#, но догадываюсь, что его DateTime — это двоичные данные. Тогда я бы почитал, что оно представляет и сделал бы простую конвертацию. В mql datetime, как известно, это количество секунд с 01.01.1970. Дата файла в винде, например, это количество единиц по 100 нс с 01.01.1601. Так что я перевел единицы в секунды и вычел разницу в секундах между 1601 и 1970 годами, учтя количество високосных лет.
Igor Makanu 2020.03.01 12:13 #13
Edgar Akhmadeev :
Я не знаю C#, но догадываюсь, что его DateTime — это двоичные данные.
в C# за что ни возьмись, все обьекты, включая и DateTime
вот в VS2019 проверил с выводом:
namespace ConsoleApp1 < class Program < static void Main(string[] args) < Console.Write("t keyword">int t = Convert.ToInt32(Console.ReadLine()); TimeSpan ts = TimeSpan.FromSeconds(t); DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc) + ts; Console.WriteLine(dt.ToLongDateString() + " : " + dt.ToLongTimeString()); Console.ReadKey(); > > >
код MQL чтобы узнать время в int ))
void OnStart() < int t =(int)TimeLocal(); Print("t comment">//t = 1583078979 >

Sergey Zhilinskiy 2020.03.01 16:36 #14
int unixTime = ( int ) ( DateTime . UtcNow — new DateTime ( 1970 , 1 , 1 ) ) . TotalSeconds ;
ROMAN KIVERIN 2020.03.02 01:34 #15
Igor Makanu :
в C# за что ни возьмись, все обьекты, включая и DateTime
вот в VS2019 проверил с выводом:
код MQL чтобы узнать время в int ))
Sergey Zhilinskiy :
int unixTime = ( int ) ( DateTime . UtcNow — new DateTime ( 1970 , 1 , 1 ) ) . TotalSeconds ;
Спасибо дорогие друзья. Премного благодарен. Без Вашей помощи никак. Ждём Тестера. 🙂
Edgar Akhmadeev :
Я не знаю C#, но догадываюсь, что его DateTime — это двоичные данные. Тогда я бы почитал, что оно представляет и сделал бы простую конвертацию. В mql datetime, как известно, это количество секунд с 01.01.1970. Дата файла в винде, например, это количество единиц по 100 нс с 01.01.1601. Так что я перевел единицы в секунды и вычел разницу в секундах между 1601 и 1970 годами, учтя количество високосных лет.
Да я тоже толком не разбираюсь. Так пальцем тыкаю наугад по клавиатуре. Спасибо есть друзья, которые могут вовремя помочь.
Всем Спасибо за уделённое внимание. Всего, всего, всего Вам самого,самого.