Сопоставить формат даты и времени ГГ.ММ с датой и временем ММ.ГГГГ

В базе данных у меня есть строка, представляющая дату и время в формате YY.MM (YY это означает Год, а MM это Месяц, например 21.03 = 2021.03)

Как я могу сопоставить это специальное format(yy.mm) с этим format(mm/yyyy), используя аннотацию данных или другим способом?

Что вы пробовали? если это строка, это звучит так, как будто это должно быть очень просто..

BugFinder 09.04.2019 09:43

Если у вас нет особой причины, нет сохраните ваши значения DateTime как string в вашей базе данных. Это плохая привычка. sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/… С другой стороны, ваш вопрос совсем не ясен. Не могли бы вы прочитать Как спросить несколько раз? Если вы просите разобрать его на DateTime на стороне C#, вы можете использовать формат yyyy.MM с методами ParseExact или TryParseExact с правильной культурой. Также помните о проблемах, чувствительных к регистру. MM — месяцы, а mm — минуты.

Soner Gönül 09.04.2019 09:43

Эта база данных не принадлежит мне! Я не разрешаю редактировать его!

Roohi 09.04.2019 09:45

19.12 это 2019.12 или 1912.12 Как это определить?

Sanu Antony 09.04.2019 09:45

@SanuAntony: Вы можете предположить, что только 2019 год правильный.

Roohi 09.04.2019 09:48

@Jahan Просто используйте разделение строки и отформатируйте его.

Sanu Antony 09.04.2019 10:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
6
177
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете сделать это так, используя функцию разделения строк:

string dateIn = "11.10";
string month = dateIn.Split('.')[1]; //split the String at the point and save it
string year = dateIn.Split('.')[0];
string dateOut = $"{month}/20{year}";   //build a new string         

//this will fix the 1900/2000 issue more or less as all dates in the furutre would be send back to the past  you can adapt this to your need:
if ( DateTime.Now.Year < Convert.ToInt32($"20{year}"))
{
    dateOut = $"{month}/19{year}";
}
//dateOut is "10/2011"

Стандарт Microsoft для двусмысленности 1900/2000, кажется, сокращается на 29/30 лет. support.office.com/en-ie/article/…. Но ваш алгоритм хорош, если база данных содержит только прошлые даты.

Teejay 09.04.2019 09:58

В любом случае, это скоро изменится (как и мы в 2019 году). А в Win 7 это можно изменить в региональных настройках.

Teejay 09.04.2019 10:03
Ответ принят как подходящий

Попробуйте Parse дату, а затем отформатируйте обратно в string:

  using System.Globalization;

  ...

  string source = "21.03";

  // 03.2021
  string result = DateTime
    .ParseExact(source, "yy'.'MM", CultureInfo.InvariantCulture)
    .ToString("MM'.'yyyy");

Однако здесь у нас есть двусмысленность: "03.50" может быть либо "March 1950", либо "March 2050". Политика по умолчанию — от 00..29 до 2000..2029 и от 30..99 до 1930..1999. Если вы хотите изменить эту политику, вы можете создать и использовать свой собственный культура:

  CultureInfo myCulture = CultureInfo.InvariantCulture.Clone() as CultureInfo;

  // Everything to 20.., never 19..
  myCulture.Calendar.TwoDigitYearMax = 2099;

  string source = "99.03";
  // 03.2099
  string result = DateTime.ParseExact(source, "yy'.'MM", myCulture).ToString("MM'.'yyyy");

Или даже

  CultureInfo myCulture = CultureInfo.CurrentCulture.Clone() as CultureInfo;

  // Everything to 20.., never 19..
  myCulture.Calendar.TwoDigitYearMax = 2099;

  // Current culture as usual, except 2 digit year policy
  CultureInfo.CurrentCulture = myCulture;

  ...

  string source = "99.03";
  // 03.2099
  string result = DateTime.ParseExact(source, "yy'.'MM", null).ToString("MM'.'yyyy");

Спасибо! И как я могу сравнить две даты и времени с точки зрения типа формата? например, если у меня есть «MM.YYYY», я не хочу анализировать дату и время.

Roohi 09.04.2019 10:32

@Jahan: при работе с Дата, пожалуйста, используйте DateTime класс, который был специально разработанный для этого: Parse[Exact] это всего одна строка, и тогда вы можете поставить легко читаемый if ((date1 == date2) && (date2 < date3)) {...} без сложных и подверженных ошибкам string манипуляций. Считайте string из СУБД, проанализируйте его в DateTime, выполните всю бизнес-логику и, наконец, при необходимости отформатируйте его обратно в String.

Dmitry Bychenko 09.04.2019 10:35

Проголосовал за описание .Calendar.TwoDigitYearMax.

Jeppe Stig Nielsen 09.04.2019 11:08

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