2

Using .Net 6 and VS2022 , consider this code:

DateOnly dateOnly= new DateOnly(2022,12,24);
            DateTime dateTime = DateTime.Now;

            if (dateTime > dateOnly)
            {

            }

It will result in this error:

Operator '>' cannot be applied to operands of type 'DateTime' and 'DateOnly'

Even there are no built-in properties to get the DateOnly from a DateTime without coding some custom extension methods nor the DateOnly.Compare methods support comparing to the DateTime type. The story is the same for TimeOnly If I am not missing something, what is the correct way of comparing these two types?

Update:

Just found It is not even possible to use these types just like other types in the webapi query parameters! Also EF core 6 does not have build-in support for these types in SqlClient!
Maybe it would be better to delay using these types...

Vivek Nuna
  • 25,472
  • 25
  • 109
  • 197
MD Zand
  • 2,366
  • 3
  • 14
  • 25

3 Answers3

4

You can get the DateOnly from DateTime like this.

DateOnly dateOnly = DateOnly.FromDateTime(dateTime);

Then you can use the CompareTo method to compare both DateOnly.

Same concept is for TimeOnly, there is a TimeOnly.FromDateTime method.

Vivek Nuna
  • 25,472
  • 25
  • 109
  • 197
  • It looks that currently converting before comparing is the only solution. I hope for a better support for these two types in the future versions. – MD Zand Dec 26 '22 at 08:20
  • 1
    @MDZand it will not will be future as well because DateTime represents date plus time, so you cannot directly compare it with only date or only time – Vivek Nuna Dec 26 '22 at 09:14
1

You can use the following methods to convert either to DateOnly or to DateTime, depending on what you need in the end.

var d = DateOnly.FromDateTime(DateTime.Now);
var dt = d.ToDateTime(TimeOnly.MinValue); // or whatever time you want
gsharp
  • 27,557
  • 22
  • 88
  • 134
-3

This can work but you need to do a little fandangling.

I.E. Convert either DateOnly or DateTime to string then convert it to the other format then use compare. Off the top of my head, I do not know the exact code but it will look like this:

DateOnly origDO;// = some value;
DateTime origDT;// = some value;

string dTString = origDT.ToString("yyyy-MM-dd HH:mm:ss");
DateOnly convertedDO = DateOnly.Parse(dTString);

//-1 = <, 0 = ==, 1 = >
DateOnly.Compare(origDO, convertedDO);

The best way, is probably to use the base conversions that gSharp showed and then use the default comparison that I showed.

Don't forget that you can always write your own comparison at any time. So, DateOnly.Day > DateTime.Day

Display name
  • 413
  • 3
  • 14
  • @Bart The question is not about best practices, it is about what is possible or not. It is not our place to judge what the asker wants, only to provide information or move on. Furthermore, I see no answer from you and no references to official document stating why the above mentioned practices should be mentioned which invalidates your argument. – Display name Jul 09 '23 at 00:34
  • 1
    I don't know what you're responding to apart from maybe my downvote, but one of the reasons answers on SO have to be taken with a big chunk of salt more often than not is exactly that attitude. Providing an answer just for the sake of it isn't helping in the long run. You could have saved it to a file and then parsed that file, which would have worked as well, but I hope you agree that this isn't a good way to teach. – Bart Aug 19 '23 at 20:20