Squeak.ru - шаблоны программирования

Как преобразовать строку в объект DateTime с текущим временем в mvc

string date = "23/12/2017";

DateTime dt = DateTime.ParseExact(
  date, 
 "dd/MM/yyyy hh:mm:ss tt", 
  CultureInfo.InvariantCulture);

но в dt это дает мне 23/12/2017 00:00:00

какой подход я должен использовать для преобразования этой строки в dd/mm/yyyy с текущим временем, как если бы я запускал этот код в 03:20 PM, я хочу "23/12/2017 03:20:00 PM" в моем объекте dt

У меня есть действие ASP.NET MVC, которое принимает дату в виде строки и сохраняет ее в таблице базы данных в поле типа DATE.

Я сохраняю в нем свой объект dt. я хочу сохранить в нем свою дату как DD/MM/YYYY, поэтому мне не нужно менять ее порядок. Прямо сейчас объект dt находится в формате ММ/ДД/ГГГГ. поэтому, когда я изучаю данные своей таблицы, он показывает мне данные (даты) в порядке ММ/ДД/ГГГГ. я хочу заказать свой объект dt как DD/MM/YYYY, чтобы он сохранялся в таблице как DD/MM/YYYY, поэтому всякий раз, когда я получаю значение из своей таблицы, мне не нужно менять порядок

/// asp.net Entities link to create connection with DataBase
    private DatabaseEntities db = new DatabaseEntities(); 

//// Method to Save date in database
    public ActionResult SaveDate(string date){
        var DateTableObject = new Date();
        DateTime dt = DateTime.ParseExact(date, "dd/MM/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture).Add(DateTime.Now.TimeOfDay); 

       DateTableObject.Date = dt;
       db.Date.add(DateTableObject);
       db.SaveChanges();
    }

    //// Model class
    public class Date{
       public DateTime Date {set; get;}
    }

/// Method to get dates
 public ActionResult GetDates(){
   return View(db.Date.tolist());
}

В представлении я получаю даты в формате ММ/ДД/ГГГГ

18.10.2017

  • Вы имеете в виду 23.12.2017 15:20:00? Если нет, то зачем терять 20 минут? Какой часовой пояс вы хотите использовать для времени - системный часовой пояс, UTC или что-то еще? (Обратите внимание, что на самом деле это не имеет ничего общего с ASP.NET.) Я ожидаю, что ваш текущий код вызовет исключение, учитывая, что вы не указываете формат, на который заявляете. Предоставьте минимально воспроизводимый пример. (На самом деле он даже не скомпилируется, поскольку вы пытаетесь разобрать date, а не s.) 18.10.2017
  • Это все равно вызовет исключение. Приложите усилия, чтобы предоставить минимально воспроизводимый пример, который вы на самом деле запустили. 18.10.2017
  • поскольку вы анализируете дату и время без времени, вы должны получить результат, который видите. вы можете добавить текущее время дня, если хотите, просто добавив DateTime.TimeOfDay msdn.microsoft.com/en-us/library/ 18.10.2017
  • Я создал DotNetFiddle для кода, но он даже не запускается: dotnetfiddle.net/baJVA3 18.10.2017
  • Большое спасибо за указание на ошибку. но он отлично работает в asp.net 18.10.2017
  • Непонятно, о чем вы спрашиваете, вы имеете в виду, что хотите, чтобы dt хранил текущее время с датой, указанной в вашей строке даты? 18.10.2017
  • проблема со временем решена. Его преобразование строки с текущим временем. Почему так получается, что я даю ему строку в порядке ДД/ММ/ГГГГ, а он дает мне преобразованный объект dt в формате ММ/ДД/ГГГГ. Я хочу, чтобы он сохранялся в базе данных в порядке DMY, поэтому, когда я получаю от него данные, я могу получить дату в порядке DMY вместо порядка MDY. 18.10.2017
  • @Azeem112, потому что вы используете строку. Строка не является датой. Просто не сохраняйте строку. Используйте поле с типом даты (т.е. дата, дата-время, дата-время2) и используйте параметризованные запросы или ORM для сохранения даты, а не строки, содержащей что-то, что может быть интерпретируется как свидание. Также не создавайте строку запроса путем конкатенации строк — добавление объекта DateTime к строке форматирует его с использованием текущей культуры. 18.10.2017
  • @Azeem112 Azeem112, если вам нужно использовать строку, по крайней мере используйте однозначный формат, например YYYYMMDD, или полный формат ISO8601. 18.10.2017
  • @Azeem112 In view I'm receiving dates in MM/DD/YYYY format. Нет, ты не такой. Вы получаете объекты DateTime, которые не имеют порядка или формы. Вы отображаете их как строки, используя текущие настройки локали. Если вы этого не хотите, укажите нужный формат. Или изменить культуру представления. По умолчанию это управляется настройками браузера. 18.10.2017
  • Этот все еще не является минимально воспроизводимым примером. Можем ли мы скопировать/вставить/скомпилировать/запустить? Нет. Если все, что вас интересует, — это преобразование строкового представления даты в значение DateTime с текущим местным временем, это полностью воспроизводимо в консольном приложении. Все ваши запросы на форматирование полностью отделены друг от друга. И я был бы крайне удивлен, если бы этот код действительно работал без исключения в ASP.NET, если значение date на самом деле просто 23/12/2017. 18.10.2017

Ответы:


1

Если вы знаете правильный язык и региональные параметры для строки даты, вы можете использовать DateTime.Parse для анализа даты и последующего добавления текущего местного времени:

var finalDateTime = DateTime.Parse("23/12/2017",CultureInfo.GetCultureInfo("en-GB"))
                            .Add(DateTime.Now.TimeOfDay);

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

Если вы не знаете локаль, а знаете только формат, вы можете использовать ParseExact для разбора даты только:

var finalDateTime = DateTime.ParseExact("23/12/2017","dd/MM/yyyy", CultureInfo.InvariantCulture)
                            .Add(DateTime.Now.TimeOfDay);

Возвращаемое значение — это дата, значение которой равно 23 декабря 2017 г. и текущее время.

Пусть вас не смущает экран отладчика. Даты не имеют формата, это двоичные значения. Однако отладчик должен отображать значение некоторым образом. Если, как это делают многие разработчики, вы используете локаль США, вы увидите дату как MM/dd/YYYY. Однако, если вы отметите свойство Month, оно будет равно 12.

18.10.2017
  • но отладчик также сохраняет дату в формате ММ/ДД/ГГГГ в базе данных. Я хочу изменить его на ДД/ММ/ГГГГ, чтобы я мог сохранить его в порядке ДД/ММ/ГГГГ, и мне не нужно менять исключительно порядок. 18.10.2017
  • @ Azeem112 отладчик ничего не сохраняет. Ваш код делает. Отладчик отображает значения в виде всплывающих подсказок и контрольных переменных. Опубликуйте свой код, если у вас есть проблема. Кстати, настаивать на том, что в датах есть какой-то формат, бессмысленно. Я тоже работаю не в США. Миллионы разработчиков делают это десятилетиями. Те, у кого возникли проблемы, либо сохранили строки вместо дат, либо были сбиты с толку форматированным значением. В любом случае, опубликуйте свой код 18.10.2017
  • @ Azeem112 Azeem112 на самом деле, моя машина разработки использует греческий язык, поэтому я могу написать DateTime.Parse("23/12/2017") напрямую и получить дату в декабре. У моего SQL Server локаль для США, и у меня не возникает вообще никаких проблем. Возможно, вы сохраняете значения, используя динамический sql вместо параметризованных запросов? 18.10.2017
  • private DatabaseEntities db = new DatabaseEntities(); public void SaveDate(string date){ var DateTableObject = new Date(); DateTime dt = DateTime.ParseExact(дата, дд/мм/гггг чч:мм:сс tt, CultureInfo.InvariantCulture).Добавить(DateTime.Now.TimeOfDay); DateTableObject.Date = дт; db.Date.add(DateTableObject); БД.СохранитьИзменения(); } публичный класс Date{ public DateTime Date {set; получать;} } 18.10.2017
  • @Azeem112 опубликуйте код в вопросе. И опубликуйте весь соответствующий код. Включая схему таблицы и классы. 18.10.2017
  • @Azeem112 Azeem112 Кстати, почему действие принимает строку? Если параметр должен быть датой, используйте SaveDate(DateTime date) и настаивайте на том, чтобы клиент использовал правильный формат. ASP.NET MVC может отлично анализировать параметры даты. Проверьте этот аналогичный вопрос stackoverflow.com/questions/1224201/ 18.10.2017
  • Потому что, если я напишу тип даты и времени в качестве параметра, он автоматически преобразует его в порядке ММ/ДД/ГГГГ. 18.10.2017
  • @ Azeem112, так что все эти миллионы разработчиков, которые не работают в США и не имеют этих проблем, ошибаются? Вы только что признали, что ваше представление форматирует даты без указания локали. Я подозреваю, что вам следует искать руководство по ASP.NET MVC, особенно посвященное интернационализации и локализации. Единственный случай, когда у вас могут возникнуть проблемы с DateTime, — это персидский календарь. Все остальное - ошибка в коде 18.10.2017
  • Спасибо большое за вашу помощь. Я возьму учебники MVC по локализации и интернационализации. 18.10.2017

  • 2

    Это может работать

     DateTime dt = DateTime.ParseExact(
                date,
                "dd/MM/yyyy",
                CultureInfo.InvariantCulture).Add(DateTime.Now.TimeOfDay);
            Console.WriteLine(dt);
    
    18.10.2017
  • хотя это будет делать то, что, кажется, хочет OP, все же странно, что OP хочет добавить текущее время к проанализированной дате (единственная причина, по которой вы хотели бы проанализировать дату, если она не гарантируется текущая дата) 18.10.2017
  • @TimothyGroote: Это не особенно странно. Например, предположим, что вы пишете приложение для ведения календаря и создаете новое событие. Пользователь может сначала выбрать дату, а затем установить дату/время по умолчанию на текущее время суток в указанную дату. 18.10.2017
  • Согласен, без контекста того, что он/она пытается сделать, я не могу понять 18.10.2017
  • Спасибо за помощь. Он сохраняет текущее время, но дата по-прежнему находится в формате мм/дд/гггг. 18.10.2017
  • Я просто конвертирую дату из даты типа ввода с текущим временем в объект времени даты. 18.10.2017
  • Даты @Azeem112 не имеют формата. Вы не путаете отображение отладчика с фактическим значением? Или вы пытались отформатировать дату в строку без указания локали, отличной от США? Возможно, вы используете локаль США, как и большинство разработчиков? 18.10.2017
  • в США они используют порядок дат MDY, но я пытаюсь преобразовать дату из элемента ввода [type=date] в порядок DMY. Я указал порядок mu в методе синтаксического анализа dd/MM/yyyy, он все еще заказывает его как MDY, и я не знаю, почему 18.10.2017
  • @JonSkeet Я все еще думаю, что некрасиво использовать время с сервера, если клиент может передать его точно так же (и рисковать столкнуться с проблемами из-за разницы между часы сервера и клиента или даже часовой пояс) (хотя, по общему признанию, использование NodaTime может исправить последнее) 18.10.2017
  • @Azeem112 снова, даты НЕ имеют ФОРМАТ. Это двоичные значения. Если вы не верите мне или документам, проверьте свойство .Month. Это 12. Форматы вступают в игру только тогда, когда вы конвертируете двоичное значение в строку. Переменная наблюдения должна преобразовать дату в строку для отображения. Однако, если вы развернете его, вы увидите, что Month равно 12. Console.WriteLine также должен преобразовать значение в строку. 18.10.2017
  • @PanagiotisKanavos да, даты являются двоичными значениями, но когда я нажимаю на столбец базы данных, чтобы изучить содержащиеся в нем данные, они отображаются в порядке MDY. Я хочу, чтобы даты хранились в порядке DMY, чтобы всякий раз, когда я получаю данные из БД, мне не приходилось каждый раз менять порядок MDY на DMY. 18.10.2017
  • @ Azeem112 какая база данных? Вы никогда не упоминали базу данных. Хотя ничего не меняется. Либо у вас есть ошибка и вы храните даты в строковых столбцах, либо вы путаете, как SSMS или любой другой клиентский инструмент, который вы используете, отображает столбцы. Если вы храните даты в виде строк, не делайте этого. Измените тип на фактическую дату. Если вы не можете, вам придется управлять преобразованием дат в строки, указав формат при сохранении в базе данных. 18.10.2017
  • @Azeem112 Azeem112, если поле базы данных имеет тип даты, просто используйте любую подходящую функцию, чтобы получить значение месяца. Будет снова 12. В SQL Server вы бы написали MONTH(myDateField) 18.10.2017
  • @PanagiotisKanavos Проблема со временем решена. У меня есть дата имени таблицы базы данных с полем даты и времени DATE. Я сохраняю в нем свой объект dt. я хочу сохранить в нем свою дату как DD/MM/YYYY, поэтому мне не нужно менять ее порядок. сейчас объект dt находится в формате ММ/ДД/ГГГГ. поэтому, когда я изучаю свою таблицу, она показывает мне данные (даты) в порядке ММ/ДД/ГГГГ. я хочу заказать свой объект dt как DD/MM/YYYY, чтобы он сохранялся в таблице как DD/MM/YYYY, поэтому всякий раз, когда я получаю значение из моей таблицы, мне не нужно менять порядок 18.10.2017
  • @ Azeem112: я хочу сохранить в нем свою дату как ДД/ММ/ГГГГ, поэтому мне не нужно менять ее порядок. Если вы передаете значение как значение DateTime, а не как строку, форматирование совершенно не имеет значения. Это похоже на решение хранить целое число в шестнадцатеричном или десятичном формате — это просто не имеет отношения к числовому значению. 18.10.2017
  • @JonSkeet Пожалуйста, не могли бы вы поделиться методом отображения моей даты в моем объекте datetime в порядке ДД/ММ/ГГГГ? asp.net использует Razor, и мне не удалось найти код для этого с использованием синтаксиса Razor. 18.10.2017
  • @Azeem112: Нет, потому что это полностью отличается от темы этого вопроса. Каждый вопрос должен быть автономным и касаться одной конкретной темы. 18.10.2017
  • Большое спасибо за помощь. Моя проблема со временем решена. Задам новый вопрос по поводу заказа и просмотра. 18.10.2017

  • 3

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

    string date;
    DateTime dt = Convert.ToDateTime(date);
    

    нанизывать:

    dt.ToString("dd-MM-yyyy", CultureInfo.InvariantCulture);
    

    получить текущее время на местном языке:

    public static DateTime GetCurrentTime()
        {
            TimeZoneInfo timeZone;
            DateTime time;
            try
            {
                timeZone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
                time = TimeZoneInfo.ConvertTime(DateTime.UtcNow, timeZone);
            }
            catch (Exception)
            {
                try
                {
                    timeZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");
                    time = TimeZoneInfo.ConvertTime(DateTime.UtcNow, timeZone);
                }
                catch (Exception)
                {
                    //logg not succeed
                    time = DateTime.Now;
                }
    
            }
            return time;
        }
    
    18.10.2017
  • Зачем это делать? DateTime имеет свойства .Now и .UtNow, которые возвращают текущее время. Вы можете извлечь временную часть с помощью TimeOfDay. Кроме того, почему вы предполагаете, что строка находится в локали пользователя? Это то, что Convert.ToDateTime(даты) делает. Это вызов DateTime.Parse с явно переданным CurrentCultureInfo 18.10.2017
  • Они возвращают время сервера, мой пример возвращает любое время в вашей стране, указав ваш местный код времени. 18.10.2017
  • Именно так я интерпретировал вопрос, потому что другие ответы касались этого, и, видимо, он был недоволен. 18.10.2017
  • Никто не спрашивал о преобразовании часового пояса. Формат OP также не содержит тире. Ничто в этом ответе не анализирует даты, что совершенно ясно в вопросе. 18.10.2017
  • Как я интерпретирую вопрос: очень нормально использовать строки для дат во внешнем интерфейсе. Итак, если он хочет заполнить эту строку, чтобы показать некоторую дату в локальном формате, он должен преобразовать дату и время, чтобы отобразить ее в своей строке. Таким образом, он мог бы использовать строку date = GetCurrentTime(). Теперь, если он получит эту строку обратно из внешнего интерфейса, ее легко снова преобразовать в дату и время, а затем сохранить ее в базе данных в правильном формате: DateTime dt = Convert.ToDateTime(date); Это полностью решит его проблему, как я ее интерпретирую (он может изменить локаль и значения формата по своему вкусу). 18.10.2017
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

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

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...