How to use DateTime to make a countdown calendar in C# - c#

I'm currently learning C# and making some console applications.
I want to create a console app which take two dates as parameters (YEAR/MONTH/DAY).
One for the start, and another one for the end.
I've tried to make a difference between the two of them, but I get the following error message:
"Cannot implicitly convert type 'System.TimeSpan' to 'System.DateTime' [Calendar]"
Here's my code:
static void Main(string[] args)
{
DateTime t = DateTime.Now;
DateTime end = new DateTime(2017, 11, 17);
int result = DateTime.Compare(t, end);
TimeSpan timeSpan = end - t;
DateTime days_left = timeSpan;
Console.WriteLine("Left", timeSpan.TotalDays);
Console.ReadKey();
}
In this version, I enter the end date in the code.
Thanks in advance for your help and for your time,

The following line is the problem:
DateTime days_left = timeSpan;
When you declared timeSpan you gave it the type TimeSpan. On the very next line, you try to assign timeSpan to days_left, which is a variable of type DateTime. This is not possible, as you cannot directly cast one type to the other.
If you think about it, this line doesn't even make sense, as DateTime objects represent a date not a time span. That is what TimeSpan objects are for!
Simply remove that line and your program will compile no problem.
Also, if I may make a suggestion, do not directly subtract DateTimes like you have done here:
var timeSpan = end - t;
Instead use DateTime.Subtract:
var timeSpan = end.Subtract(t);
This is the recommended approach when dealing with the difference between DateTimes, as it offers benefits such as adjusting for different time zones.
Finally, note my usage of the var keyword instead of explicitly declaring the type. This is a common coding convention in C# that I wish I knew as a beginner.
Here is a revised version of your code. Take some tips from it if you want for programs you write in the future:
public static void Main()
{
var currentDate = DateTime.Now; // Descriptive variable names
var endDate = new DateTime(2017, 11, 17);
double remainingDays = endDate.Subtract(currentDate).TotalDays; //TimeSpan stores everything in doubles instead of integers
Console.WriteLine("Days left: {0}", remainingDays); // Use String.Format formatting
Console.ReadLine(); // Use readline so that program only exists when ENTER is pressed
}

Try changing your code to this
DateTime t = DateTime.Now;
DateTime end = new DateTime(2017, 11, 17);
int result = DateTime.Compare(t, end);
TimeSpan timeSpan = end.Subtract(t);

Related

Creating an array of DateTime without the time portion

I've created an array of DateTime objects. However when doing so by default the array has the time portion attacthed. I need to this removed to compare to another date which is simply in the "dd/MM/yyyy" format.
Creating the array:
DateTime[] exclusionDates = new DateTime[] { new DateTime(2017, 1, 1) };
I'm trying to compare that with
monthlyCalendar.SelectionEnd.Date == excluHarry[0].Date
How do I remove the time portion to the element of the array?
Thanks.
You are already excluding the time portion when you use the .Date on the DateTime object.
Also, a DateTime object has no format, it only gets a format when you call .ToString() on it, your monthlyCalendar object calls .ToString("dd/MM/yyyy") internally before displaying it to the user, that is the only reason you see it in that form from the user's perspective.
.Date from a DateTime object will get you what you looking for without having to got to string conversion. I have attached example code with two DateTime objects with same date but with different times. The if statement compares only the date portion. Please do accept the answer that helped you the most. Welcome to stack overflow
using System;
namespace DateObject
{
class Program
{
static void Main(string[] args)
{
DateTime[] exDates = new DateTime[] {new DateTime(2017, 1, 1)};
var dt = exDates[0].Date;
//new date with a different time
DateTime t = new DateTime(2017, 1, 1, 5, 30, 23);
//compare the two for date part only --exclude the time in the comparision
if (dt.Equals(t.Date))
{
Console.WriteLine("Dates are the same without comparing the time");
}
}
}
}

Convert Time into Double

How may I get the "DateTime" function on a program and convert it into a double variable? My goal is to do some time operations like
(imagine that this variable t1 is a static "time" already written in a label)
(now imagine that t2 is the DateTime from the computer)
t1 = 03:40:11
t2 = DateTime
t3 = t2 (that would be DateTime converted) + t1
How would I turn this DateTime into double so I can do this operation?
You don't need to convert it into a double. You can perform arithmetic directly on the DateTime object:
var date = new DateTime(1944, 6, 6, 1, 10, 0);
var time = TimeSpan.Parse("03:40:11");
var newDate = date.Add(time);
Console.WriteLine(newDate); // Prints "06/06/1944 04:50:11"
Multiple operations are possible on raw TimeSpans. However, you can use it's TotalSeconds, TotalHours etc. propetries, which are double. Later, you can return to the TimeSpan world by TimeSpan.FromMinutes(m1 + m2 * 7.5).
There is no operator for adding two DateTime's. And since a DateTime is an absolute time value it would make much sense to add two absolute time values.
But you can do:
DateTime dt = DateTime.Now;
TimeSpan ts = TimeSpan.Parse("12:00:00");
DateTime dt1 = dt + ts; // Adding a TimeSpan to a DateTime
TimeSpan ts1 = DateTime.Now - dt; // Substracting two DateTimes
I've done like RB and it worked, btw I've found what was missing for my program to do this kind of addition.
I forgot to call a variable "DateTime" that would be "DateTime.Now" and I finished it doing:
dateTime = my variable which gets the time from the computer
timeSpan - my variable which has a static time number
var finalTime = dateTime.Add(timeSpan).
Thank you guys for your help!

How to do a calculation with DateTime.Now()

this question may seem simple to some, but it's got my mind baffled completely - I'm a bit of a newbie to C#.
The set-up:
Trying to do a calculation with DateTime.Now() for an "Alarm" based application.
The problem:
I have one label, which displays the current time.
I have one Masked Text box, which accepts user inputs when he/she sets the alarm.
I'm trying to do a calculation, whereby I'll add another label displaying the time a person still has left to sleep.
Which, conceptually, should look something like
TimeLeftToSleep(lbl) = CurrentAlarmTime-DateTime.Now()
It keeps giving an error though, tried parsing, but I can't seem to get it to work the error it produces is a long the lines of:
Operator '-' cannot be applied to operands of type 'string' and 'System.DateTime'.
The TextBox.Text provides a string, you should first parse it to a DateTime to do any calculation with it.
DateTime result;
if (DateTime.TryParse(textbox1.Text, out result))
{
// the delta between two datetimes is a timespan.
TimeSpan delta = result - DateTime.Now;
// show the timespan within the label.
TimeLeftToSleep.Text = delta.ToString();
}
else
{
// the textbox doesn't contain a valid datetime.
}
For more info on TimeSpan: http://msdn.microsoft.com/en-us/library/ee372286(v=vs.110).aspx
And here for DateTime.TryParse method: http://msdn.microsoft.com/en-us/library/ch92fbc1(v=vs.110).aspx
Your CurrentAlarmTime must be type of DateTime. DateTime has numbers of constructors and Parse methods, that should not be a problem.
Also DateTime.Now is a property, get rid of the parentheses.
I would do something like this:
(CurrentAlarmTime - DateTime.Now).Ticks
and use ticks value to get a TimeSpan.
It appears that your CurrentAlarmTime is a string - I assume this is the text the user entered. In order to perform date mathematics on this value, you need to first turn it into a DateTime using the DateTime.Parse() method.
var parsedCurrentAlarmTime = DateTime.Parse(CurrentAlarmTime);
It looks like your CurrentAlarmTime is a string. You can use DateTime.Parse to get a DateTime from it, then your subtraction should work (and result in a TimeSpan object).
Also, DateTime.Now is a property, not a method. You do not need to (and shouldn't) write () after it.
There are a few errors in your code. DateTime.Now is a property, so remove the parentheses. Your CurrentAlarmTime is of type "string" so you need to convert it to a DateTime first.
Look at the following example (it's not complete and not very good but should give you an idea of what you should do):
Edited since user don't have two textboxes.
int hour = 0;
int minute = 0;
try
{
hour = int.Parse(this.AlarmTextBox.Text.Split(':').First());
minute = int.Parse(this.AlarmTextBox.Text.Split(':').Last());
}
catch
{
}
var currentAlarmTime = DateTime.Today.AddHours(hour).AddMinutes(minute);
var timeLeftToSleep = currentAlarmTime - DateTime.Now;
this.timeLeftToSleepLabel.Text = string.Format("{0}:{1}", timeLeftToSleep.TotalHours, timeLeftToSleep.Minutes);
You should use DateTime class method Subtract as:
var date2 = DateTime.Parse(DateTime.Now.ToShortDateString() + " 10:00");
System.TimeSpan diff1 = date2.Subtract(DateTime.Now);

What is the easiest method to remove the Millisecond's part of a DateTime.UctNow.TimeOfDay?

I have a theory why the following code is not producing the results I need:
endDate = DateTime.UtcNow.AddDays(1).ToShortDateString() + " " +
DateTime.UtcNow.TimeOfDay.Subtract(
new TimeSpan(0, 0, 0, 0, DateTime.UtcNow.TimeOfDay.Milliseconds));
The processor must calculate the DateTime.UtcNow.TimeOfDay.Milliseconds, and due to the time length of a single tick of the CPU (and the time to process this property and return a result), It does not denote that DateTime.UtcNow.TimeOfDay.Milliseconds will subtract the exact amount of milliseconds specified by the DateTime.UtcNow.TimeOfDay
I need to know, what is the simplest and most effective method to remove the amount of milliseconds from DateTime.UtcNow.TimeOfDay, without having to use a huge amount of processor time? This application of mine is pretty big, and this problem is pretty simple. But when this application gets deployed, there are no room for it to be unstable. This milliseconds must be trimmed because it is sent to a stored procedure in SQL Server, and this specific stored procedure does not support milliseconds on DateTimes. I also run into this problem commonly, but I normally convert the date to string (which is a cast on its own), split the string at the full stop at milliseconds, and use the index position 0 to get the time i need. Is there a shorter, more effective way?
Stability and speed is most important to me.
Thanks in advance
Don't repeatedly use the Now/UtcNow property in the same expression. Get the value once, and use the same value in the different places:
DateTime now = DateTime.Now;
endDate = now.AddDays(1).ToShortDateString() + " " +
now.TimeOfDay.Subtract(
new TimeSpan(0, 0, 0, 0, now.TimeOfDay.Milliseconds));
If you only want the date formatted in a special way, and don't need the actual DateTime value, you can just skip the milliseconds in the format, for example:
endDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
As you are sending the value to the database, you should not send it as a string, but as a DateTime value:
DateTime now = DateTime.Now;
DateTime endDate = now - new TimeSpan(0, 0, 0, 0, now.TimeOfDay.Milliseconds);
Everything you need to know about customising the DateTime ToString format is here on MSDN.
In simple terms, something like this:
endDate = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd hh:mm:ss");
(alter the format as desired)
If you want to remove milliseconds without having any problem on ticks.
DateTime d = DateTime.Now;
var newDate = new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second);
Basically, you create a new DateTime instance from an existing one, but set everything "smaller" then Milliseconds to zero. You can use an extensions method:
public static class DateTimeExtensions
{
public static DateTime ZeroMilliseconds(this DateTime dt)
{
return new DateTime(((dt.Ticks / 10000000) * 10000000), dt.Kind);
}
}
Or for a full example using your code:
var now = DateTime.Now;
endDate = now.AddDays(1).ToShortDateString() + " " + now.ZeroMilliseconds().TimeOfDay;
Use C# DateTime formatting as described very well in the MSDN. Your analysis on milisecond calculation is quite possibly wrong. Also for string concatenation use a StringBuilder

Differences between 2 times?

StartCopying = DateTime.Now;
File.Copy(#"C:\Users\sshap5x\Desktop\line4\shiraDebbi\Hackers.avi", #"C:\Users\sshap5x\Desktop\test\Hackers.avi", true);
EndCopying = DateTime.Now;
CopyingTime1 = (endCopying - startCopying).Duration;
What is the problem with my code?
Copying time is TimeSpan object.
The assignments are to StartCopying and EndCopying but your read the data from other variables startCopying and endCopying.
C# is case sensitive.
And also Duration is a method. so you need to use .Duration()
And as suggested in the comments to your question, for better resolution use the Stopwatch class.
// This prints 0.1 (roughly)
DateTime start = DateTime.Now;
Thread.Sleep(100);
var diff = DateTime.Now - start;
Console.WriteLine(diff.TotalSeconds);
In your code (which wouldn't even compile) you use .Duration as a property when it is in fact a method. In any case, you don't need to call Duration at all because the result returned by the subtraction is a TimeSpan containing the difference. You can then get this diff in whatever format you need (milliseconds, seconds, hours, days, etc.).
The only need for the Duration method is if you are unsure whether the result is negative or positive.
Did you forget the () for Duration and capitalisation for the variables EndCopying and StartCopying?
DateTime StartCopying = DateTime.Now;
DateTime EndCopying = DateTime.Now;
TimeSpan CopyingTime1 = (EndCopying - StartCopying).Duration();

Categories

Resources