Почему не делает DateTime. ToShortTimeString () уважают Кратковременный формат в “Региональном и Настройки Языка”?

Как сделать, надежный асинхронный comms

не использует методы блокирования, внутренний класс помощника имеет некоторые тонкие ошибки.

Использование APM с классом состояния сеанса, экземпляры которого управляют буферным и буферным курсором, совместно использованным через вызовы и реализацию обратного вызова, которая переносится EndRead в try...catch. В нормальном функционировании последняя вещь try, который должен сделать блок, настраивается следующий перекрытый обратный вызов ввода-вывода с вызовом к BeginRead().

то, Когда вещи спутываются, catch, должно асинхронно вызвать делегата в методе перезапуска. Реализация обратного вызова должна сразу выйти после catch блок так, чтобы логика перезапуска могла уничтожить текущую сессию (состояние сеанса почти наверняка повреждено) и создают новую сессию. Метод перезапуска должен не быть реализованным на классе состояния сеанса, потому что это препятствовало бы тому, чтобы он уничтожил и воссоздал сессию.

, Когда объект SerialPort закрывается (который произойдет, когда приложение выйдет) может быть незаконченная операция ввода-вывода. Когда это будет так, закрытие SerialPort инициирует обратный вызов, и при этих условиях EndRead выдаст исключение, которое неотличимо от общего comms shitfit. Необходимо установить флаг в состоянии сеанса для запрещения поведения перезапуска в catch блок. Это будет мешать Вашему методу перезапуска вмешаться в естественное завершение работы.

на Эту архитектуру можно положиться для не содержания на объект SerialPort неожиданно.

метод перезапуска справляется с закрытием и повторным открытием объекта последовательного порта. После вызова Close() на эти SerialPort объект звоните Thread.Sleep(5), чтобы дать ему шанс отпустить. Для чего-то еще возможно захватить порт, так быть готово иметь дело с этим при повторном открытии его.

10
задан Richard Slater 18 August 2009 в 09:40
поделиться

2 ответа

В ответ на каждый из моих вопросов:

1) В чем мое непонимание форматов .NET и Windows?

Короткий ответ: нет связи между Время »в настройках« Язык и региональные стандарты »и в свойстве .NET ShortTimePattern. Однако свойство LongTimePattern определяется настройкой «Long Time».

Я адаптировал описанный выше метод, заменив две строки форматирования на:

string sixAmString = sixAm.ToString("T", culture.DateTimeFormat);
string sixPmString = sixPm.ToString("T", culture.DateTimeFormat);

Вот результат:

Culture: en-GB, 6AM: 06:00:00, 6PM: 18:00:00 // HH:mm:ss
Culture: en-GB, 6AM: 06:00:00 AM, 6PM: 06:00:00 PM //hh:mm:ss tt

Внизу этой статьи объяснил мне проблему.

2) Как лучше всего создать строку времени в коротком формате (ЧЧ: мм или чч: мм tt) на основе настроек операционной системы?

Я не знаю о лучшее решение, но я создал следующую функцию, которая преобразует LongTimeFormat в ShortTimeFormat, тем самым позволяя приложению следовать параметрам пользователей, если они изменяют «Долгое время» (хотя оно не будет отслеживать настройку «Кратковременное время»).

static string GetShortTimeString(DateTime ShortTimeString)
{
    DateTimeFormatInfo dateTimeFormat = CultureInfo.CurrentCulture.DateTimeFormat;
    string ShortTimePattern = dateTimeFormat.LongTimePattern.Replace(":ss", String.Empty);
    ShortTimePattern = ShortTimePattern.Replace(":s", String.Empty);

    return ShortTimeString.ToString(ShortTimePattern);
}

Результат после внесения вышеуказанных изменений:

Culture: en-GB, 6AM: 06:00, 6PM: 18:00
Culture: en-GB, 6AM: 06:00 AM, 6PM: 06:00 PM

Параметр P / Invoke должен использовать GetTimeFormat , передавая TIME_NOSECONDS с использованием DateTime.ToString (Format), как указано выше. Я не тестировал это, так как предпочел бы избегать использования P / Invoke.

1
ответ дан 4 December 2019 в 02:26
поделиться

Ответ на ваш второй вопрос:

DateTimeFormat.Format(DateTime.Now, "t", CultureInfo.CurrentUICulture);

или

DateTime.Now.ToString("t", CultureInfo.CurrentUICulture);

На самом деле всегда лучше использовать явные методы, принимающие CultureInfo. Нет единообразия в том, как .Net выбирает, что использовать по умолчанию: CurrentCulture, CurrentUICulture или InvarinatCulture.

Чтобы дать полный ответ. Также я обозначу различия между культурами.

Итак, CurrentCulture - это «Панель управления -> Часы, язык и регион -> Регион и язык -> вкладка« Форматы »». Это культура, которой вы ожидаете от своих расчетов. Например, вы можете вести учет в США, поэтому вы должны настроить это в США.

CurrentUICulture - это «Регион и язык -> Язык отображения». Это означает, что если вы эмигрант из Украины, вы хотите, чтобы ваше приложение было локализовано в UA (но все вычисления все еще производятся в США).

И InvariantCulture - это так называемый языковой стандарт, не зависящий от культуры. Вы должны использовать это для хранения информации и так далее. Фактически это En-US.

Примечание: я могу ошибаться, когда каждая настройка находится в окнах. Но у вас, наверное, есть идея.

5
ответ дан 4 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

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