Установите переменную в определенное время определенного часового пояса [dубликат]

Внешний вид - одна из панелей управления в Центре управления GNOME. В Ubuntu 11.10 конкретная команда для появления Appearance - gnome-control-center background. (Это то, что запускается при поиске Appearance в тире Unity и нажмите на результат.) Пакет, который предоставляет исполняемый файл Центра управления GNOME, имеет то же имя, что и исполняемый файл: gnome-control-center

В предыдущем версии Ubuntu, был запущен определенный исполняемый файл, чтобы запустить панель управления Appearance: gnome-appearance-properties (Но это все еще было предоставлено пакетом gnome-control-center.)

В случае, если вы заинтересованы , чтобы узнать эту информацию, я открыл окно терминала (Ctrl + Alt + T) и создал файл с именем 1, содержащий информацию обо всех запущенных процессах в моей системе:

ps ax > 1

Затем я открыл тираж Unity и искал Appearance и нажал на один результат поиска. Появилась панель управления Appearance . Я вернулся в открытое окно терминала и создал новый файл с именем 2, содержащий информацию о запущенных процессах в системе:

ps ax > 2

Затем я сравнил их содержимое:

diff 1 2

Это дало мне этот текст, в котором было всего несколько неспаренных записей, из которых наиболее очевидно было gnome-control-center background. (Тогда, если вы не уверены, что это правильно, вы можете проверить свой ответ, запустив эту команду, чтобы увидеть, вызывает ли оно окно «Внешний вид».)

Затем я пошел в this текст , а в разделе «Поиск содержимого пакетов» убедитесь, что «Oneiric» был выбран в качестве выпуска и искал gnome-control-center. Это показало, что этот исполняемый файл предоставляется пакетом с таким же именем.

Это несколько технический (и есть другие способы сделать это, например, просмотрев файлы .desktop, чтобы найти команду), поэтому, пожалуйста, чувствуйте бесплатно продолжать публиковать вопросы об этом. Но если вы почувствуете это, вы сможете найти ответы на эти вопросы, когда будете иметь их в будущем ... и когда другие пользователи спросят их.

121
задан 8 February 2018 в 12:58

4 ответа

Другие ответы здесь полезны, но они не охватывают, как получить доступ к Pacific конкретно - здесь вы идете:

public static DateTime GmtToPacific(DateTime dateTime)
{
    return TimeZoneInfo.ConvertTimeFromUtc(dateTime,
        TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
}

Как ни странно, хотя «Стандартное тихоокеанское время» обычно означает что-то отличное от " Pacific Daily Time ", в данном случае это относится к тихоокеанскому времени в целом. Фактически, если вы используете FindSystemTimeZoneById для его получения, одним из доступных свойств является bool, сообщающий вам, находится ли этот часовой пояс в настоящее время в летнее время или нет.

Вы можете увидеть более обобщенные примеры этого в библиотеку, в которую я попал, чтобы разобраться с DateTimes, которые мне нужны в разных часовых поясах, на основе запроса пользователя и т. д .:

https://github.com/b9chris/TimeZoneInfoLib.Net

Это не будет работать за пределами Windows (например, Mono в Linux), так как список раз поступает из реестра Windows: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\

Под этим вы найдете ключи (значки папок в редакторе реестра); имена этих ключей - это то, что вы переходите к FindSystemTimeZoneById. В Linux вы должны использовать отдельный набор определений часового пояса Linux-стандарта, который я недостаточно изучил.

29
ответ дан 15 August 2018 в 15:39
  • 1
    Отличный момент, я никогда об этом не думал! – Mark Kram 27 January 2012 в 06:27
  • 2
    Кроме того, существует ConvertTimeBySystemTimeZoneId () ex: TimeZoneInfo.ConvertTimeBySystemTimeZoneId (DateTime.UtcNow, «Центральное стандартное время») – Brent 10 August 2015 в 17:35

Структура DateTimeOffset была создана именно для этого типа использования.

См. http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx

Вот пример создания объекта DateTimeOffset с определенным часовым поясом:

DateTimeOffset do1 = new DateTimeOffset(2008, 8, 22, 1, 0, 0, new TimeSpan(-5, 0, 0));

41
ответ дан 15 August 2018 в 15:39
  • 1
    Спасибо, это хороший способ сделать это. После того, как вы получите объект DateTimeOffset в правильном часовом поясе, вы можете использовать свойство .UtcDateTime, чтобы получить время UTC для созданного вами. Если вы сохраняете свои даты в UTC, то конвертирование их в местное время для каждого пользователя не имеет большого значения :) – Redth 21 April 2010 в 17:56
  • 2
    Просто то, что я искал благодаря! – Kelly 19 July 2012 в 20:52
  • 3
    Я не думаю, что это правильно управляет летним временем, так как некоторые часовые пояса почитают его, а другие нет. Также & quot; в день & quot; DST начинается / заканчивается, части этого дня будут отключены. – crokusek 3 October 2015 в 00:36
  • 4
    Урок. DST является правилом определенного часового пояса. DateTimeOffset не может не ассоциироваться ни с одним часовым поясом. Не путайте значение смещения UTC, например -5, с часовым поясом. Это не часовой пояс, это смещение. Такое же смещение часто используется многими часовыми поясами, поэтому это неоднозначный способ обращения к часовому поясу. Поскольку DateTimeOffset связан со смещением, а не с часовым поясом, он не может применять правила DST. Таким образом, 3am будет составлять 3 часа в каждый отдельный день года без исключения в структуре DateTimeOffset (например, в его свойствах Hours и TimeOfDay). – Triynko 19 February 2016 в 02:26
  • 5
    Итак, реальная проблема с DateTimeOffset заключается в том, что она не содержит достаточной информации. Он включает смещение, а не часовой пояс. Смещение неоднозначно с несколькими часовыми поясами. – Triynko 19 February 2016 в 02:30

Мне нравится ответ Джона Скита, но хотелось бы добавить одно. Я не уверен, что Джон ожидал, что ctor будет всегда передаваться в локальном часовом поясе. Но я хочу использовать его для случаев, когда это нечто иное, чем локальное.

Я читаю значения из базы данных, и я знаю, в какой временной зоне находится база данных. Поэтому в ctor я перейду в часовой пояс базы данных. Но тогда я хотел бы получить значение в местном времени. Локальный режим Jon's Time не возвращает исходную дату, преобразованную в локальную дату часового пояса. Он возвращает дату, преобразованную в исходный часовой пояс (все, что вы передали в ctor).

Я думаю, что эти имена свойств очищают его ...

public DateTime TimeInOriginalZone { get { return TimeZoneInfo.ConvertTime(utcDateTime, timeZone); } }
public DateTime TimeInLocalZone    { get { return TimeZoneInfo.ConvertTime(utcDateTime, TimeZoneInfo.Local); } }
public DateTime TimeInSpecificZone(TimeZoneInfo tz)
{
    return TimeZoneInfo.ConvertTime(utcDateTime, tz);
}
2
ответ дан 15 August 2018 в 15:39

Вам нужно будет создать для него настраиваемый объект. Ваш пользовательский объект будет содержать два значения:

a Значение DateTime a Объект TimeZone

Не уверен, что уже есть тип данных, предоставляемых CLR, который имеет это, но, по крайней мере, компонент TimeZone уже доступен.

2
ответ дан 15 August 2018 в 15:39

Другие вопросы по тегам:

Похожие вопросы: