C# .Net Linq и преобразование datetime в форматированное sting

У меня есть запрос

var result =  (from myView in db.loginSessions
    where myView.machine.ToUpper().Equals(machine.ToUpper())
          && myView.start >= myStart
          && myView.end <= myEnd
    orderby myView.start
    select new loginSessionList {
        Id = myView.id,
        Machine = myView.machine.ToUpper(),
        Start = myView.start.ToString("u"),
        End = myView.end.ToString("u"),
        User = myView.username
    }).ToList();

Я получаю исключения ArgumentOutOfRange при преобразовании даты и времени. Я пробовал разные строки преобразования ToString. Я пробовал другие преобразования даты в строку To..., предлагаемые Intellisence. Я пробовал Convert.string(myView.start). Ничего не получилось. Я погуглил и нашел совет, используя все, что я пробовал. Нужно ли мне обрабатывать сгенерированный список пост-обработкой?

Что я пропустил?

Независимо от того, нужно ли вам это или нет, почти всегда лучше использовать сильные типы (DateTime), пока вы не будете готовы отобразить его пользователю (экран / извлечение / и т. д.). Поэтому, если возможно, эти даты должны быть DateTime в классе loginSessionList, и вы можете разобраться с их форматированием позже.

Joe Enos 12.03.2018 15:55

Спасибо. Это привело меня к ответу. Я имел использовал DateTime в loginSessionList, но у меня возникли проблемы. Я изменил эти записи на строки и в итоге задал вопрос выше. Моя проблема заключалась в том, что имена полей в loginSessionList когда-то были lowercase. Некоторое переформатирование кода, кажется, бесполезно для них CamelCased, и это испортило то, что получилось в результате десериализации.

7 Reeds 12.03.2018 16:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
69
2

Ответы 2

У меня есть 3 правила работы с DateTimes, которые мне очень пригодились:

  1. Всегда сохраняйте, извлекайте и передавайте значение UTC. Перевод в правильный местный часовой пояс - это задача ToString (), которая запрашивает у Windows часовой пояс пользователя. Вы не хотите добавлять часовые пояса к своим проблемам.
  2. Избегайте хранения, извлечения или передачи DateTimes в виде строк. По возможности храните его в правильных типах
  3. Если вы не можете следовать правилу 2 (например, когда вы имеете дело с сериализацией), по крайней мере выберите фиксированный формат культуры и строковую кодировку на всех конечных точках. Вы не хотите получать различные культуры или ошибочные подразумеваемые кодировки для существующих проблем.

Это первое правило - не всегда хорошая идея. Если я запланировал календарное мероприятие на «12 марта 2022 года, 15:00 по Лондону», я бы хотел, чтобы эта информация сохранялась - так что если в период с этого момента правила часовых поясов будут изменены, событие по-прежнему представляет информацию, которая предоставленный пользователем. Точно так же событие с первым наступлением «12 марта 2018 года, 15:00 в Лондоне, повторяющееся раз в неделю» действительно должно знать часовой пояс, чтобы справиться с изменениями летнего времени. Запись прошедшего момента времени (например, метки времени) через UTC - это нормально, но я бы не стал заходить слишком далеко.

Jon Skeet 12.03.2018 16:01

@JonSkeet: вы хотите, чтобы было сохранено, что дата находится в Лондоне, и поэтому при отображении следует использовать лондонские часовые пояса. Вы действительно нет хотите сохранить что-нибудь, кроме UTC, в базе данных Backend. Имеете дело с такими деталями, как изменение часовых поясов / летнего времени? это то, что, надеюсь, уже делают форматы культуры и ToString (). В противном случае это слишком хлопотно.

Christopher 12.03.2018 16:04

Опять же, я категорически не согласен. Если у вас все хранится в формате UTC, собираетесь ли вы запустить бэкэнд-задание, которое изменит все, если правила часовых поясов когда-либо изменятся? (И правила часовых поясов делать меняются очень часто.) Мантра «хранить только в формате UTC» часто цитируется и хорошо работает в простых ситуациях, но ее недостаточно для всех приложений, и ее не следует формулировать безоговорочно, например это, ИМО.

Jon Skeet 12.03.2018 16:06

И нет, часовой пояс полностью отделен от культуры / формата. Если правила часового пояса меняются, это изменяет когда происходит событие. Это не то же самое, что изменить просто текстовое представление.

Jon Skeet 12.03.2018 16:07

@JonSkeet Перевод "UTC" в "часовой пояс, выбранный текущим пользователем" - это то, что делает ToString () и Windows в тысячу раз лучше, чем я когда-либо мог. Зачем мне заново изобретать колесо, когда моя рабочая машина стоит прямо там, а у меня есть ключи?

Christopher 12.03.2018 16:16

Я никогда не предлагал вам выполнить преобразование часового пояса, написав этот код самостоятельно. Для этого вам следует использовать хорошую библиотеку (я, конечно, порекомендовал бы свою библиотеку Noda Time). Но дело в том, что вы храните. Если вы попросите Windows преобразовать «12 марта 2022 года, 15:00 по Лондону» в UTC, а затем сохранить это значение UTC, вы потеряете информацию. Если правила часовых поясов изменятся в следующем году, так что (скажем) Великобритания постоянно находится в UTC + 1, информация в вашей базе данных больше не будет соответствовать тому, что пользователь попросил вас сохранить. Они попросили вас оставить магазин «12 марта 2022 года, 15:00 в Лондоне».

Jon Skeet 12.03.2018 16:18

Для получения дополнительной информации я бы рекомендовал прочитать отличный ответ Мэтта Джонсона здесь: stackoverflow.com/questions/19626177/…

Jon Skeet 12.03.2018 16:22

«Если в следующем году правила часовых поясов изменятся так, что (скажем) Великобритания будет постоянно находиться на UTC + 1», то это действительно зависит от того, как другая сторона с этим справится. Было ли собрание выполнено в том же всемирном координированном времени или было адаптировано к местному времени? В любом случае вы ошибаетесь в половине случаев и должны спросить другую сторону.

Christopher 12.03.2018 16:22

Это при условии, что есть «другая сторона». Вполне может не быть - это может быть даже не встреча; есть много других мероприятий. Но по сути, я привожу пример, когда пользователь доверил вам информацию о том, что что-то произойдет «12 марта 2022 года, 15:00 в Лондоне». Преобразование этого в UTC теряет информацию, поэтому я бы предложил избегать этого (или, по крайней мере, не Только, сохраняющий UTC, а не Только в отношении информации о часовом поясе как чего-то связанного со строковым представлением).

Jon Skeet 12.03.2018 16:25

@JonSkeet: если дата закрытия фондовой биржи за пределами Великобритании и у вас есть только 1 час, чтобы отреагировать на данные, ваш Metting должен оставаться в том же всемирном координированном времени, или это бессмысленно (данных еще нет или окно возможностей прошло) . Авиакомпании / аэропорту, возможно, придется перетасовать рейсы, потому что кто-то только что изменил свои часовые пояса, в результате чего самый важный человек приедет раньше / позже. Еще одно собрание, возможно, пришлось бы перенести. Как только часовые пояса меняются, кто-то должен пройти проверку. Даже в вашем случае кому-то все равно придется пойти и изменить, что «Целевой часовой пояс» имелось в виду в БД.

Christopher 12.03.2018 16:50

Если пользователь хочет запланировать свое мероприятие в формате UTC, это нормально. Но вы, похоже, предполагаете, что знаете лучше, чем пользователь, и что пользователь, говорящий «12 марта 2022 года, 15:00 в Лондоне», на самом деле не понимает, что они имеют в виду. Я предпочитаю хранить данные, которые выразил пользователь, как окончательный источник истины. Возможно, стоит сохранить значение UTC также и пересчитать его, когда вы знаете, что меняете данные часового пояса, но то, что вы отстаиваете, - это потеря информации, и я не понимаю, как это хорошая идея.

Jon Skeet 12.03.2018 17:00

Итак, ответ на мою проблему не имел ничего общего с Linq или .Net. @JoeEnos направил меня на правильный путь, как упоминалось в моем комментарии к его комментарию. Я создал класс для получения каждой строки результата запроса. Поля даты изначально были типа DateTime, но у меня начались проблемы. Я изменил эти поля на строку, а затем задал свой вопрос выше.

Раньше, когда у принимающего класса еще были поля DateTime, все поля имели имена в нижнем регистре. Я, должно быть, применил какое-то форматирование кода, которое CamelCased имен полей. Это означало, что после сериализации результатов имена CamelCased не могли быть найдены, и JavaScript не заботился.

Я исправил имена полей в своем js-коде, изменил типы данных полей обратно на DateTime, и все в порядке.

Спасибо

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