Периоди от време в дни, месеци и години (разлика между днешна дата и въведена дата)
Би ли могъл някой да каже как да се програмира в C# разликата, разбирай периода от време, между въведена дата и днешната дата в дни, месеци и години?
Би ли могъл някой да каже как да се програмира в C# разликата, разбирай периода от време, между въведена дата и днешната дата в дни, месеци и години?
DateTime oldDate = new DateTime(2000, 8, 4);
DateTime newDate = DateTime.Now;
TimeSpan ts = newDate - oldDate;
Console.WriteLine($"Years: {ts.Days / 365} Months: {(ts.Days/ 365) * 12} Days: {ts.Days}");
Това ще свърши ли работа
Давам отговор на себе си, защото след дълги лутания, стигнах до този резултат. Решението използва метод DateTimeSpan, който е въведен в класа на праграмата, извън метода Main. (Тук трябва да благодаря на (VasilValchanov и на https://stackoverflow.com/questions/4638993/difference-in-months-between-two-dates.
Надавам се да бъде полезно на някой, който търси отговор за "Интервал между дадена дата и днешния ден"!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Zaplata
{
class Program
{
static void Main(string[] args)
{
Console.Write("Дата днес е: ");
Console.WriteLine(DateTime.Now);
Console.Write("Дата на постъпване на работа: ");
DateTime DataEntrance = DateTime.Parse(Console.ReadLine());
DateTime todaydata = DateTime.Today;
var dateSpan = DateTimeSpan.CompareDates(DataEntrance, todaydata);
Console.WriteLine(" Прослуженото време е: "+dateSpan.Years + " Years, " + dateSpan.Months+ " Months, " + dateSpan.Days+ " Days");
Console.WriteLine();
}
public struct DateTimeSpan
{
private readonly int years;
private readonly int months;
private readonly int days;
private readonly int hours;
private readonly int minutes;
private readonly int seconds;
private readonly int milliseconds;
public DateTimeSpan(int years, int months, int days, int hours, int minutes, int seconds, int milliseconds)
{
this.years = years;
this.months = months;
this.days = days;
this.hours = hours;
this.minutes = minutes;
this.seconds = seconds;
this.milliseconds = milliseconds;
}
public int Years { get { return years; } }
public int Months { get { return months; } }
public int Days { get { return days; } }
public int Hours { get { return hours; } }
public int Minutes { get { return minutes; } }
public int Seconds { get { return seconds; } }
public int Milliseconds { get { return milliseconds; } }
enum Phase { Years, Months, Days, Done }
public static DateTimeSpan CompareDates(DateTime date1, DateTime date2)
{
if (date2 < date1)
{
var sub = date1;
date1 = date2;
date2 = sub;
}
DateTime current = date1;
int years = 0;
int months = 0;
int days = 0;
Phase phase = Phase.Years;
DateTimeSpan span = new DateTimeSpan();
int officialDay = current.Day;
while (phase != Phase.Done)
{
switch (phase)
{
case Phase.Years:
if (current.AddYears(years + 1) > date2)
{
phase = Phase.Months;
current = current.AddYears(years);
}
else
{
years++;
}
break;
case Phase.Months:
if (current.AddMonths(months + 1) > date2)
{
phase = Phase.Days;
current = current.AddMonths(months);
if (current.Day < officialDay && officialDay <= DateTime.DaysInMonth(current.Year, current.Month))
current = current.AddDays(officialDay - current.Day);
}
else
{
months++;
}
break;
case Phase.Days:
if (current.AddDays(days + 1) > date2)
{
current = current.AddDays(days);
var timespan = date2 - current;
span = new DateTimeSpan(years, months, days, timespan.Hours, timespan.Minutes, timespan.Seconds, timespan.Milliseconds);
phase = Phase.Done;
}
else
{
days++;
}
break;
}
}
return span;
}
}
}
}
Благодаря за бързия отговор!
Но тъй коато съм доста начинаеща, ще питам още нещо: Не трябва ли преди код да се въведат проманливи и дали програмата ще отчита всеки днешен ден и в бъдеще..., ако правилно се изразявам!?
oldDate, newDate и ts са променливите в случая ако това имаш в предвид
DateTime newDate = DateTime.Now; а тази променлива взима точната дата в момента на компилация, така че ако пуснеш програмата след 2 месеца, ще вземе тогавашната дата и съответно ще изчисли новата разлика.
Благодаря за уточнението! Това имах предвид, но се питах, дали не у нужно някакво допълнително "обявяване" и определяне на тези променливи преди това....Освен това, тук четох за някои методи за превръщане на датата в число и обратно. Ще ми е нужно ли тук? И ще мога ли да използвам крайната променлива "ts" в друга връзка на по-широка програма? (искам, например, получения период от време в месеци да се изследва за кратност на три, защото тогава се случва нещо - бонус в заплащането, в моя случай)?