Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/47: Рейтинг темы: голосов - 47, средняя оценка - 4.79
22 / 20 / 5
Регистрация: 29.02.2016
Сообщений: 590

Преобразовать String DateTime в UTC

03.09.2019, 14:27. Показов 8829. Ответов 19
Метки utc (Все метки)

Студворк — интернет-сервис помощи студентам
Есть строка. К примеру:
C#
1
string s = "23.08.2019 20:06:21"
Нужно как-то получить время UTC, соответствующее этому времени.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.09.2019, 14:27
Ответы с готовыми решениями:

Перевод из UTC в DateTime
Самый банальный вопрос) Как из UTC значения времени получить DateTime. НЕ НАОБОРОТ!

Из string в DateTime - Exception "String was not recognized as a valid DateTime"
У меня в базе данных есть записи такого рода: 2016-8-4 0:01:13 Как можно конвертировать обратно в DateTime в C#? Мои попытки: while...

Как преобразовать long в UTC?
Есть время UTC в long, к примеру 1526987355. Как это число преобразовать в DateTime? DateTime UtcDate = new DateTime(1526987355,...

19
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
03.09.2019, 14:37
Цитата Сообщение от D7ILeucoH Посмотреть сообщение
Нужно как-то получить время UTC
Так может оно уже UTC ?
1
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
03.09.2019, 14:53
D7ILeucoH, парсите в Datetime и вызываете
DateTime.ToUniversalTime
0
6 / 6 / 1
Регистрация: 12.10.2016
Сообщений: 141
03.09.2019, 15:39
Если вам нужно преобразование
C#
1
2
string s = "23.08.2019 20:06:21";
DateTime date = Convert.ToDateTime(s);
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11239 / 2887
Регистрация: 21.04.2018
Сообщений: 33,040
Записей в блоге: 2
03.09.2019, 15:45
Цитата Сообщение от Рядовой Посмотреть сообщение
парсите в Datetime и вызываете
Цитата Сообщение от Yerta Посмотреть сообщение
Если вам нужно преобразование
Но для получения UTC, как верно отметил Почтальон, надо сначала узнать в каком поясе задано исходное время.
А этой информации в строке "23.08.2019 20:06:21" нет.
1
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
03.09.2019, 17:08
точно. не заметил. Но если предположить что время было задано в текущем часовом поясе, DateTime будет создан с установленным на машине поясом и будет вычислено верное время.
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
03.09.2019, 23:56
Цитата Сообщение от Рядовой Посмотреть сообщение
DateTime будет создан с установленным на машине поясом
У DateTime нет никакого пояса.

Если нужно, чтобы время было 20:06:21
C#
1
2
3
            string s = "23.08.2019 20:06:21";
            var dt = new DateTimeOffset(DateTime.Parse(s), TimeSpan.Zero);
            Console.WriteLine(dt);
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11239 / 2887
Регистрация: 21.04.2018
Сообщений: 33,040
Записей в блоге: 2
04.09.2019, 00:22
Цитата Сообщение от amr-now Посмотреть сообщение
Если нужно, чтобы время было 20:06:21
Не-а...
Как следует из ТЗ исходное время "23.08.2019 20:06:21" это время в каком-то поясе.
А надо получить время в UTC.
Для этого надо откуда-то взять TimeSpan offset который вы приняли за TimeSpan.Zero.
Но какой он на самом деле?

В условиях задачи нет этой информации. И поэтому, на мой взгляд, она не имеет решения.
0
C# = ♫♪♫♪♪♫
 Аватар для Sanek32
57 / 56 / 18
Регистрация: 02.08.2014
Сообщений: 283
04.09.2019, 04:17
Может автор хочет получить относительно этой даты, дату для других часовых поясов.
2
1 / 1 / 0
Регистрация: 04.09.2019
Сообщений: 2
04.09.2019, 04:29
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
 
namespace _ex1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Время применяет текущие настройки часового пояса компьютера
            string s = "23.08.2019 20:06:21";
            DateTime dt = DateTime.Parse(s);
 
            Console.WriteLine(dt);
            Console.WriteLine(dt.Kind);
            Console.WriteLine();
 
            DateTime local = dt.ToLocalTime();
            Console.WriteLine(local);
            Console.WriteLine(local.Kind);
            Console.WriteLine();
 
            DateTime utc = dt.ToUniversalTime();
            Console.WriteLine(utc);
            Console.WriteLine(utc.Kind);
            Console.WriteLine();
 
            DateTimeOffset dto = new DateTimeOffset(dt);
            Console.WriteLine(dto);
            Console.WriteLine(dto.UtcDateTime);
            Console.WriteLine(dto.LocalDateTime);
            Console.WriteLine(dto.DateTime);
            Console.WriteLine();
 
            DateTimeOffset dtoLocal = new DateTimeOffset(dt);
            DateTimeOffset dtoUtc = local.ToUniversalTime();
            Console.WriteLine(dtoLocal.Offset);
            Console.WriteLine(dtoUtc.Offset);
            Console.WriteLine();
 
            TimeZoneInfo tzi = TimeZoneInfo.Local;
            Console.WriteLine(tzi);
 
            Console.ReadKey();
 
        }
    }
}
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
04.09.2019, 07:09
Лучший ответ Сообщение было отмечено Элд Хасп как решение

Решение

Почтальон, Элд Хасп, вопрос этой темы можно разделить на два вопроса:
- Мы хотим полностью сохранить компонент даты-времени без изменения, просто считая дату находящейся в часовом поясе UTC.
- Мы хотим сконвертировать компонент даты-времени из некоего часового пояса в часовой пояс UTC. Соответственно сломаем через колено компоненту даты-времени в дате.
Из какого часового пояса конвертировать - не указано.

Соответственно, мы можем решить напрямую именно первый вопрос. Компонент даты-времени переносим абсолютно без изменения.
В MS SQL Server 2016:
T-SQL
1
2
3
declare @dt datetime = '23.08.2019 20:06:21'
declare @utc datetimeoffset = @dt at time zone 'UTC'
select @dt, @utc
В более старой версии MS SQL Server 2008:
T-SQL
1
2
3
declare @dt datetime = '23.08.2019 20:06:21'
declare @utc datetimeoffset = todatetimeoffset(@dt, 0)
select @dt, @utc
В C#:
C#
1
2
3
4
5
6
string s = "23.08.2019 20:06:21";
var dt = new DateTimeOffset(DateTime.Parse(s), TimeSpan.Zero);
Console.WriteLine(dt);
 
var dt2 = DateTimeOffset.Parse(s, CultureInfo.GetCultureInfo("ru-RU"), DateTimeStyles.AssumeUniversal);
Console.WriteLine(dt2);
Добавлено через 2 минуты
Сейчас на форумах идёт бурное обсуждение, что тип DateTime в общем и целом устарел, и уже назрела необходимость на серверах использовать DateTimeOffset.
Предпосылки:
- сейчас уже хватает места на винчестере, чтобы хранить компоненту смещения.
- в России 11 часовых поясов. И как бы уже надо.
- в странах встречается переход на летнее/зимнее время. DateTimeOffset исправляет коллизии с переходом на летнее время.
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11239 / 2887
Регистрация: 21.04.2018
Сообщений: 33,040
Записей в блоге: 2
04.09.2019, 09:20
Цитата Сообщение от amr-now Посмотреть сообщение
- Мы хотим сконвертировать компонент даты-времени из некоего часового пояса в часовой пояс UTC. Соответственно сломаем через колено компоненту даты-времени в дате.
Из какого часового пояса конвертировать - не указано.
Цитата Сообщение от amr-now Посмотреть сообщение
В C#:
Прекрасное решение!
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
04.09.2019, 09:41
На заметку, чтобы два раза не вставать.
Имя часового пояса в Windows, на которой установлен экземпляр MS SQL Server:
T-SQL
1
2
3
4
5
6
7
declare @name nvarchar(30)
exec xp_instance_regread 
    @rootkey = N'HKEY_LOCAL_MACHINE', 
    @key = N'SYSTEM\CurrentControlSet\Control\TimeZoneInformation', 
    @value_name = N'TimeZoneKeyName', 
    @value = @name out
select @name
Типа для эквивалента функции - "Преобразуй в свой часовой пояс на сервере, не знаю какой".
2
05.09.2019, 06:36

Не по теме:

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Прекрасное решение!
Которое предложил я ранее. правда в виде картинки и без разъяснения ... :)

0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11239 / 2887
Регистрация: 21.04.2018
Сообщений: 33,040
Записей в блоге: 2
05.09.2019, 09:57
Цитата Сообщение от Sanek32 Посмотреть сообщение
Которое предложил я ранее. правда в виде картинки и без разъяснения ...
Да, действительно.
Совет на будущее - не надо выкладывать код скриншотом.
0
22 / 20 / 5
Регистрация: 29.02.2016
Сообщений: 590
05.09.2019, 16:53  [ТС]
Хватит гнать. Исходное, шмисходное. Мне надо время секунд с момента UNIX дать, а вы мне начинаете чё-то там говорить что я ошибся.
Какой начечел эмулятор, ёж? Какая разница, какой часовой пояс, если во входной строке его вообще нет? Неужели сложно догадаться, (омагад, как же сложно было догадаться) что это и есть нулевой часовой пояс?
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
05.09.2019, 17:53
Unix time в секундах с 1970-01-01 UTC:
C#
1
2
3
4
5
6
string s = "23.08.2019 20:06:21";
 
var d1 = DateTime.Parse(s, CultureInfo.GetCultureInfo("ru-RU"), DateTimeStyles.AdjustToUniversal);
var d2 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var unixTime = (int)(d1 - d2).TotalSeconds;
Console.WriteLine(unixTime);
DateTimeStyles оказались глюкавыми настройками для DateTime. Неадекватное поведение. Просишь UTC, а выдаёт Unspecified.
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14159 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
05.09.2019, 23:18
По мотивам ответа amr-now
C#
1
2
3
4
string s = "23.08.2019 20:06:21";
var d1 = DateTimeOffset.Parse(s, CultureInfo.GetCultureInfo("ru-RU"), DateTimeStyles.AdjustToUniversal);
long unixTime = d1.ToUnixTimeSeconds();
Console.WriteLine(unixTime);
Цитата Сообщение от D7ILeucoH Посмотреть сообщение
Какая разница, какой часовой пояс, если во входной строке его вообще нет?
Без знания часового пояса операции с датой могут дать неверный результат. Поэтому это исключительно важно знать.

Цитата Сообщение от D7ILeucoH Посмотреть сообщение
Неужели сложно догадаться, (омагад, как же сложно было догадаться) что это и есть нулевой часовой пояс?
Из текста вопроса это никак не следовало, а строить догадки при работе с датами это путь к ошибкам.

Цитата Сообщение от D7ILeucoH Посмотреть сообщение
Мне надо время секунд с момента UNIX дать
Трудно было сразу об этом написать? Время Unix отчитывается в UTC и вопросов про часовой пояс не возникло бы.
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
06.09.2019, 04:50
OwenGlendower, в DateTimeOffset глюкавость DateTimeStyles по-другому проявляется.
Если строка даты именно уже в часовом поясе UTC, то надо именно для DateTimeOffset использовать другое значение перечисления:
C#
1
2
3
4
5
6
7
string s = "23.08.2019 20:06:21";
 
var d1 = DateTimeOffset.Parse(s, CultureInfo.GetCultureInfo("ru-RU"), DateTimeStyles.AssumeUniversal);
var unixTime =d1.ToUnixTimeSeconds();
Console.WriteLine(unixTime);
 
Console.WriteLine(d1);
В результате мы опять пляшем вокруг DateTimeOffset с принудительно приклеенным нулевым смещением.
Те же самые исходные два варианта создать дату-время в UTC.
1
22 / 20 / 5
Регистрация: 29.02.2016
Сообщений: 590
06.09.2019, 14:30  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Трудно было сразу об этом написать? Время Unix отчитывается в UTC и вопросов про часовой пояс не возникло бы.
Согласен, ошибся. Просил не то, что хотел получить. Всё правильно, время UNIX необходимо получить, то есть время секунд, прошедшее с 1970.01.01 00:00:00.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.09.2019, 14:30
Помогаю со студенческими работами здесь

Сервер возвращает "UTC-05:00 Eastern Time (US & Canada)". Можно ли ее сохранить в БД как datetime
Сервер отдает мне строку "UTC-05:00 Eastern Time (US & Canada)" что это за сущность? Могу ли я ее сохранить в базу как datetime?...

Как преобразовать строку с датой формата UTC в дату вида 17.07.2015 17:04:43?
У меня есть такая строка с датой: 2018-10-22T11:41:40 UTC Как ее преобразовать в такую строку: 22.10.2018 17:41:30? Добавлено через...

DateTime.ParseExact(String, String, IFormatProvider)
Обьясните пожалуста действие второго string(format) в методе DateTime.ParseExact(String, String, IFormatProvider),как выбирать формат в...

Преобразование текстового представления времени в формате UTC в локальное представление DateTime
Здравствуйте. Я в целом неплохо разбираюсь в классах DateTime и производных, но следующий случай поставил меня в тупик. Как...

Не удается преобразовать тип String в System.DateTime
string ss = ""; if (radioButton1.Checked == true) { ss = "Бессрочно"; } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru