How to Represent a Time Only Value in .Net

How do I represent a time only value in .NET?

As others have said, you can use a DateTime and ignore the date, or use a TimeSpan. Personally I'm not keen on either of these solutions, as neither type really reflects the concept you're trying to represent - I regard the date/time types in .NET as somewhat on the sparse side which is one of the reasons I started Noda Time. In Noda Time, you can use the LocalTime type to represent a time of day.

Note that as of .NET 6, there are TimeOnly and DateOnly types which are roughly equivalent to Noda Time's LocalTime and LocalDate types.

One thing to consider: the time of day is not necessarily the length of time since midnight on the same day...

(As another aside, if you're also wanting to represent a closing time of a shop, you may find that you want to represent 24:00, i.e. the time at the end of the day. Most date/time APIs - including Noda Time - don't allow that to be represented as a time-of-day value.)

What's best practice to represent a Time object in C#?

You could use a TimeSpan structure to represent a time in .NET.

How to set only time part of a DateTime variable in C#

Use the constructor that allows you to specify the year, month, day, hours, minutes, and seconds:

var dateNow = DateTime.Now;
var date = new DateTime(dateNow.Year, dateNow.Month, dateNow.Day, 4, 5, 6);

Getting only time of a datetime object

You can use the ToString method with the appropriate formatting string:

var time = date.ToString("H:mm");

How to cast TimeOnly to DateTime in C#?

Since TimeOnly holds no date information, you'll need a reference date, then add the time contained in the TimeOnly object by using the ToTimeSpan method.

TimeOnly timeOnly = new TimeOnly(10, 10, 10);
var referenceDate = new DateTime(2022, 1, 1);
referenceDate += timeOnly.ToTimeSpan();
Console.WriteLine(dateTime); // 1/1/2022 10:10:10 AM

T-SQL has a `time` data type -- does C# have just `time`, instead of `datetime` data type?

The .Net framework does not have a built in Time type nor does it have a built in Date type.

It does have TimeSpan, but that is not the same as Time - A c# TimeSpan is actually a duration - the amount of time between two points in time - while SQL Server's Time data type is actually the time of day - and is also documented as such:

Defines a time of a day. The time is without time zone awareness and is based on a 24-hour clock.

It's range is 00:00:00.0000000 through 23:59:59.9999999.

The .Net's TimeSpan struct, however, is documented as

Represents a time interval.

and it's range spans from it's MinValue through has MaxValue fields, which are

-10675199.02:48:05.4775808 through 10675199.02:48:05.4775807.

Having said all that, since the .Net framework has no TimeOfDay data type, it use a TimeSpan to map to SQL Server's Time data type, and you can feel free to use that data type to represent the time of day (that's also the type of the DateTime's struct Time property, which means that the .Net framework itself use this type to represent time of day.

If you want an alternative date time api for .Net, you should check out NodaTime.

How to save time only without the date using ASP.NET MVC 5 Data Annotation DataType.Time?

In that case you need to store that as a string. You cannot separate Time from Date using BCL (Base Class Library) of .Net. They cannot exist as independent entities.

However youcan have a workaround to save Time in a TimeSpan object using this Representing Time (not date and time) in C#

In DateTime only 62 of 64 bits are used. Negative values are not in the spec. How do I represent dates BC?

The top two bits are used for the "kind":

  • Local
  • UTC
  • Unspecified
  • "Local with special knowledge for ambiguous cases"

See my blog post for more information on this. Admittedly the "kind" was only introduced in .NET 1.1 (IIRC); I suspect the range limit before then was simply a matter of pragmatism. There are all kinds of practical issues that arise when you decide to handle values earlier than 0001-01-01, and I suspect the .NET designers considered that those issues would hurt more developers than the number of developers who need the larger date range.

In terms of how to deal with earlier dates, I would strongly advise against writing your own date/time code unless you absolutely have to. I would personally recommend my Noda Time library. That handles dates in the range [9999BC, 9999AD], as well as having nanosecond precision for times, and support for the IANA time zone database.



Related Topics



Leave a reply



Submit