В базе данных у меня есть строка, представляющая дату и время в формате YY.MM
(YY
это означает Год, а MM
это Месяц, например 21.03 = 2021.03
)
Как я могу сопоставить это специальное format(yy.mm)
с этим format(mm/yyyy)
, используя аннотацию данных или другим способом?
Если у вас нет особой причины, нет сохраните ваши значения DateTime
как string
в вашей базе данных. Это плохая привычка. sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/… С другой стороны, ваш вопрос совсем не ясен. Не могли бы вы прочитать Как спросить несколько раз? Если вы просите разобрать его на DateTime на стороне C#, вы можете использовать формат yyyy.MM
с методами ParseExact
или TryParseExact
с правильной культурой. Также помните о проблемах, чувствительных к регистру. MM
— месяцы, а mm
— минуты.
Эта база данных не принадлежит мне! Я не разрешаю редактировать его!
19.12 это 2019.12 или 1912.12 Как это определить?
@SanuAntony: Вы можете предположить, что только 2019 год правильный.
@Jahan Просто используйте разделение строки и отформатируйте его.
Вы можете сделать это так, используя функцию разделения строк:
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/…. Но ваш алгоритм хорош, если база данных содержит только прошлые даты.
В любом случае, это скоро изменится (как и мы в 2019 году). А в Win 7 это можно изменить в региональных настройках.
Попробуйте 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», я не хочу анализировать дату и время.
@Jahan: при работе с Дата, пожалуйста, используйте DateTime
класс, который был специально разработанный для этого: Parse[Exact]
это всего одна строка, и тогда вы можете поставить легко читаемый if ((date1 == date2) && (date2 < date3)) {...}
без сложных и подверженных ошибкам string
манипуляций. Считайте string
из СУБД, проанализируйте его в DateTime
, выполните всю бизнес-логику и, наконец, при необходимости отформатируйте его обратно в String
.
Проголосовал за описание .Calendar.TwoDigitYearMax
.
Что вы пробовали? если это строка, это звучит так, как будто это должно быть очень просто..