Софтуерно Инженерство
Loading...
+ Нов въпрос
Joro_Paspalev avatar Joro_Paspalev 8 Точки

Разлика между "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-May-2016, 7-May-2016, 8-May-2016, 14-May-2016, 15-May-2016

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:

  • 22.02.2020 and 23.02.2020
  • 29.02.2020 and 1.03.2020

 

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);

           

        }
    }
}
 

 

 

0
Fundamentals Module
VasilKotsev avatar VasilKotsev 797 Точки

Това е нормалното поведение на форматите за дати и време. Разликата м/у "d" и "dd" например, е че втория формат ще има leading zero(1 -> 01). Аналогично е и за месеците. Можеш да се разровиш в документацията на .NET за Custom date and time formats ако искаш за по-детайлно сравнение и примери. 

1
Joro_Paspalev avatar Joro_Paspalev 8 Точки

Здравей,

точно това направих - четох около 2 часа документацията на Microsoft, тествах с много различни примери и няма логика между това, което е написано и това, което се случва в действителност. Мисля че разликата между "d" и "dd" формата с водеща нула има значение само при писането на конзолата (с Console.WriteLine()), а не при четене (DateTime.ParseExact()), но точно това ми е въпроса - защо при едното работи по един начин, а при другото по съвсем различен. По това което прочетох пише че метода ParseExact() чете текст само в посочения формат т.е. ако е xx.xx.xxxx текста и той трабвя да е същия, дори да има един символ отклонение от това трябва да дава Exeption, а в горната задача е даден формат "d.M.yyyy", подаваме му вход "dd.M.yyyy" и пак работи. Ето това е загадката за мен!

0
VasilKotsev avatar VasilKotsev 797 Точки

Добре, ако искаш да parsе-неш дата от низ, с формат без leading нули, какво ще се случи според теб когато дните или месеца е двуцифрено число ? По твойта логика трябва само до 9-то число и месец да работим с дати ако формата е "d.M.yyyy"...  ParseExact() ще ти хвърли FormatException, когато стринговата репрезентация на датата, която искаш да парснеш не съответства на формат низа, а дадените примери съответстват. Това е очакваното и правилно поведение на метода и форматите, все пак не са ги писали случайни хора... 

1
17/05/2019 11:10:03