Разлика между "d.M.yyyy" и "dd.MM.yyyy" в метода DateTime.ParseExact()
Здравейте, колеги,
при четене на string от конзолата и преобразуване към DateTime тип данни на задача Holidays Between Two Dates, след като използвам метода .ParseExact() би трябвало входните данни за датата да бъдат в точно определен формат - имам впредвид ако подам дата 02.05.2019, формата трябва да е "dd.MM.yyyy" . Ако подам 1.05.2019, формата трябва да е "d.MM.yyyy" , ако подам дата 22.6.19 формата трябва да е "dd.M.yy" ако не бъркам.
Та въпроса ми е защо когато формата е "d.M.yyyy" чете дата 11.05.2019 или дата 15.12.2019, като тази дата би трябвало да съответства на формата "dd.MM.yyyy"
Моля за помощ
Ито я и задачата и кода който оправих, незнайно как:
1.Debug the Code: Holidays Between Two Dates
You are assigned to find and fix the bugs in an existing piece of code, using the Visual Studio debugger. You should trace the program execution to find the lines of code that produce incorrect or unexpected results.
You are given a program (existing source code) that aims to count the non-working days between two dates given in format day.month.year (e.g. between 1.05.2015 and 15.05.2015 there are 5 non-working days – Saturday and Sunday).
Examples
Input |
Output |
Comments |
1.05.2016 15.05.2016 |
5 |
There are 5 non-working days (Saturday / Sunday) in this period: |
1.5.2016 2.5.2016 |
1 |
Only 1 non-working day in the specified period: 1.05.2016 (Sunday) |
15.5.2020 10.5.2020 |
0 |
The second date is before the first. No dates in the range. |
22.2.2020 1.3.2020 |
4 |
Two Saturdays and Sundays:
|
using System;
using System.IO;
using System.Globalization;
namespace Delete
{
class Program
{
public static System.Globalization.CultureInfo InvariantCulture;
static void Main(string[] args)
{
DateTime startDate = DateTime.ParseExact(Console.ReadLine(), "d.M.yyyy", CultureInfo.InvariantCulture);
DateTime endDate = DateTime.ParseExact(Console.ReadLine(), "d.M.yyyy", CultureInfo.InvariantCulture);
int holidaysCount = 0;
for (DateTime date = startDate; date <= endDate; date = date.AddDays(1))
if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday)
{
holidaysCount++;
}
Console.WriteLine(holidaysCount);
}
}
}
Здравей,
точно това направих - четох около 2 часа документацията на Microsoft, тествах с много различни примери и няма логика между това, което е написано и това, което се случва в действителност. Мисля че разликата между "d" и "dd" формата с водеща нула има значение само при писането на конзолата (с Console.WriteLine()), а не при четене (DateTime.ParseExact()), но точно това ми е въпроса - защо при едното работи по един начин, а при другото по съвсем различен. По това което прочетох пише че метода ParseExact() чете текст само в посочения формат т.е. ако е xx.xx.xxxx текста и той трабвя да е същия, дори да има един символ отклонение от това трябва да дава Exeption, а в горната задача е даден формат "d.M.yyyy", подаваме му вход "dd.M.yyyy" и пак работи. Ето това е загадката за мен!
Добре, ако искаш да parsе-неш дата от низ, с формат без leading нули, какво ще се случи според теб когато дните или месеца е двуцифрено число ? По твойта логика трябва само до 9-то число и месец да работим с дати ако формата е "d.M.yyyy"... ParseExact() ще ти хвърли FormatException, когато стринговата репрезентация на датата, която искаш да парснеш не съответства на формат низа, а дадените примери съответстват. Това е очакваното и правилно поведение на метода и форматите, все пак не са ги писали случайни хора...
https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings d => от 1 до 31, dd => от 01 до 31.
Здравей,
съгласен съм с теб. Точно това казвам и аз.
Ето и нагледно с пример:
в ParseExact задавам формат "d.M.yyyy" т.е. да чете само 1 символ за ден, 1 символ за месец и 4 символа за година. Подавам му два символа за ден, два символа за година и работи, а би трябвало да даде Exeption. Няма логика?
Да не се занимаваме с това повече, че само ви губя времето. При следващ проблем ще го мисля.
Кое от "d=> от 1 до 31; dd=> от 01 до 31" точно не разбра? Пробвай малко четене с разбиране. 1 до 31 са валидни за d, 1 до 12 са валидни за М. dd не означава 2 символа, означава водеща 0 при дати от 1 до 9, нагоре са си еднакви и за 2-та варианта. d=> 1 - 9, 10, 11 etc., dd=> 01-09, 10, 11 etc.
Благодаря ти TeMePyT,
сега го разбрах. Когато използвам "d.M.yyyy" този формат чете всички дни от 1 до 31 число на месеца, както чете и всички месеци от 1ви до 12ти, без значение дали са написани с или без водеща нула т.е. ако на конзолата напиша 01.01.2019 или 1.1.2019 то е едно и също.
При формата обаче "dd.MM.yyyy" трябва задължително за дните, които са с една цифра (от 1 до 9) както и за месеците (от 1 до 9) да се пише 01.01.2019.
Ако напиша 1.1.2019 се чупи т.е. по "универсалния" начин е да се използва само с един символ - "d.M.yyyy" за да не се налага да се пише 0 пред дните и месеците.
Благодаря, сега вече ми се изясни!