<!--
GENERATED FILE - DO NOT EDIT
This file was generated by [MarkdownSnippets](https://github.com/SimonCropp/MarkdownSnippets).
Source File: /docs/mdsource/dates.source.md
To change this file edit the source file and then run MarkdownSnippets.
-->

# Dates

By default dates and times (`DateTime`, `DateTimeOffset`, `DateOnly`, and `TimeOnly`) are sanitized during verification. This is done by finding each date and taking a counter based that that specific date. That counter is then used replace the date values. This allows for repeatable tests when date values are changing.

<!-- snippet: Date -->
<a id='snippet-Date'></a>
```cs
var dateTime = DateTime.Now;
var dateTimeOffset = DateTimeOffset.Now;
var target = new DateTimeTarget
{
    DateTime = dateTime,
    Date = new(dateTime.Year, dateTime.Month, dateTime.Day),
    DateNullable = new(dateTime.Year, dateTime.Month, dateTime.Day),
    DateString = new Date(dateTime.Year, dateTime.Month, dateTime.Day).ToString(),
    DateTimeNullable = dateTime,
    DateTimeString = dateTime.ToString("F"),
    DateTimeOffset = dateTimeOffset,
    DateTimeOffsetNullable = dateTimeOffset,
    DateTimeOffsetString = dateTimeOffset.ToString("F")
};

await Verify(target);
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1052-L1071' title='Snippet source file'>snippet source</a> | <a href='#snippet-Date' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->

Results in the following:

<!-- snippet: SerializationTests.ReUseDatetime.verified.txt -->
<a id='snippet-SerializationTests.ReUseDatetime.verified.txt'></a>
```txt
{
  DateTime: DateTime_1,
  DateTimeNullable: DateTime_1,
  Date: Date_1,
  DateNullable: Date_1,
  DateTimeOffset: DateTimeOffset_1,
  DateTimeOffsetNullable: DateTimeOffset_1,
  DateTimeString: DateTimeOffset_2,
  DateTimeOffsetString: DateTimeOffset_2,
  DateString: Date_1
}
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.ReUseDateTime.verified.txt#L1-L11' title='Snippet source file'>snippet source</a> | <a href='#snippet-SerializationTests.ReUseDatetime.verified.txt' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->

To disable this behavior use:


### Instance

<!-- snippet: DontScrubDateTimes -->
<a id='snippet-DontScrubDateTimes'></a>
```cs
var target = new
{
    Date = new DateTime(2020, 10, 10, 0, 0, 0, DateTimeKind.Utc)
};

var settings = new VerifySettings();
settings.DontScrubDateTimes();

return Verify(target, settings);
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1716-L1728' title='Snippet source file'>snippet source</a> | <a href='#snippet-DontScrubDateTimes' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


### Fluent

<!-- snippet: DontScrubDateTimesFluent -->
<a id='snippet-DontScrubDateTimesFluent'></a>
```cs
var target = new
{
    Date = new DateTime(2020, 10, 10, 0, 0, 0, DateTimeKind.Utc)
};

return Verify(target)
    .DontScrubDateTimes();
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1734-L1744' title='Snippet source file'>snippet source</a> | <a href='#snippet-DontScrubDateTimesFluent' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


### Globally

<!-- snippet: DontScrubDateTimesGlobal -->
<a id='snippet-DontScrubDateTimesGlobal'></a>
```cs
[ModuleInitializer]
public static void ModuleInitializer() =>
    VerifierSettings.DontScrubDateTimes();
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1802-L1808' title='Snippet source file'>snippet source</a> | <a href='#snippet-DontScrubDateTimesGlobal' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


## DisableDateCounting

If many calls are made to the current date/time in quick succession, the date counting behavior (`DateTime_x`) can result in inconsistent results. To revert to the simpler scrubbing convention (`{Scrubbed}`) use DisableDateCounting.


### Instance

<!-- snippet: DisableDateCounting -->
<a id='snippet-DisableDateCounting'></a>
```cs
var target = new
{
    Date = new DateTime(2020, 10, 10, 0, 0, 0, DateTimeKind.Utc)
};

var settings = new VerifySettings();
settings.DisableDateCounting();

return Verify(target, settings);
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1763-L1775' title='Snippet source file'>snippet source</a> | <a href='#snippet-DisableDateCounting' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


### Fluent

<!-- snippet: DisableDateCountingFluent -->
<a id='snippet-DisableDateCountingFluent'></a>
```cs
var target = new
{
    Date = new DateTime(2020, 10, 10, 0, 0, 0, DateTimeKind.Utc)
};

return Verify(target)
    .DisableDateCounting();
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1781-L1791' title='Snippet source file'>snippet source</a> | <a href='#snippet-DisableDateCountingFluent' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


### Globally

<!-- snippet: DisableDateCountingGlobal -->
<a id='snippet-DisableDateCountingGlobal'></a>
```cs
[ModuleInitializer]
public static void ModuleInitializer() =>
    VerifierSettings.DisableDateCounting();
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1750-L1756' title='Snippet source file'>snippet source</a> | <a href='#snippet-DisableDateCountingGlobal' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


## AddExtraDateTimeFormat

`AddExtraDateTimeFormat` allows specifying custom date formats to be scrubbed.

<!-- snippet: AddExtraDateTimeFormat -->
<a id='snippet-AddExtraDateTimeFormat'></a>
```cs
[ModuleInitializer]
public static void UseAddExtraDateTimeFormat() =>
    VerifierSettings.AddExtraDateTimeFormat("yyyy-MM-dd");

[Fact]
public Task WithExtraDateTimeFormat() =>
    Verify(
        new
        {
            date = "2022-11-08"
        });
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L45-L59' title='Snippet source file'>snippet source</a> | <a href='#snippet-AddExtraDateTimeFormat' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


## Inline Dates

Strings containing inline dates can also be scrubbed. There a equivalent APIs for `DateOnly`, `DateTime`, and `DateTimeOffset`.


### Instance

<!-- snippet: ScrubInlineDateTimesInstance -->
<a id='snippet-ScrubInlineDateTimesInstance'></a>
```cs
[Fact]
public Task ScrubInlineDateTimesInstance()
{
    var settings = new VerifySettings();
    settings.ScrubInlineDateTimes("yyyy-MM-dd");
    return Verify(
        "content 2020-10-20 content",
        settings);
}
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1686-L1698' title='Snippet source file'>snippet source</a> | <a href='#snippet-ScrubInlineDateTimesInstance' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


### Fluent

<!-- snippet: ScrubInlineDateTimesFluent -->
<a id='snippet-ScrubInlineDateTimesFluent'></a>
```cs
[Fact]
public Task ScrubInlineDateTimesFluent() =>
    Verify("content 2020-10-20 content")
        .ScrubInlineDateTimes("yyyy-MM-dd");
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1677-L1684' title='Snippet source file'>snippet source</a> | <a href='#snippet-ScrubInlineDateTimesFluent' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


### Globally

<!-- snippet: ScrubInlineDateTimesGlobal -->
<a id='snippet-ScrubInlineDateTimesGlobal'></a>
```cs
public static class ModuleInitializer
{
    [ModuleInitializer]
    public static void Init() =>
        VerifierSettings.ScrubInlineDateTimes("yyyy-MM-dd");
}
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1665-L1674' title='Snippet source file'>snippet source</a> | <a href='#snippet-ScrubInlineDateTimesGlobal' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


## Named Date and Times

Specific date or times can be named. When any of those values are found, they will be matched with the corresponding name.


### Instance

<!-- snippet: NamedDatesAndTimesInstance -->
<a id='snippet-NamedDatesAndTimesInstance'></a>
```cs
var settings = new VerifySettings();
settings.AddNamedDate(new(2020, 10, 11), "instanceNamedDate");
settings.AddNamedTime(new(1, 2), "instanceTime");
settings.AddNamedDateTime(new(2030, 1, 2), "instanceNamedDateTime");
settings.AddNamedDateTimeOffset(new DateTime(2030, 1, 2), "instanceNamedTimeOffset");
await Verify(target, settings);
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1234-L1243' title='Snippet source file'>snippet source</a> | <a href='#snippet-NamedDatesAndTimesInstance' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


### Instance

<!-- snippet: NamedDatesAndTimesFluent -->
<a id='snippet-NamedDatesAndTimesFluent'></a>
```cs
await Verify(target)
    .AddNamedDate(new(2020, 10, 11), "instanceNamedDate")
    .AddNamedTime(new(1, 2), "instanceTime")
    .AddNamedDateTime(new(2030, 1, 2), "instanceNamedDateTime")
    .AddNamedDateTimeOffset(new DateTime(2030, 1, 2), "instanceNamedTimeOffset");
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1191-L1199' title='Snippet source file'>snippet source</a> | <a href='#snippet-NamedDatesAndTimesFluent' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


### Globally

<!-- snippet: NamedDatesAndTimesGlobal -->
<a id='snippet-NamedDatesAndTimesGlobal'></a>
```cs
[ModuleInitializer]
public static void NamedDatesAndTimesGlobal()
{
    VerifierSettings.AddNamedDateTime(new(2030, 1, 1), "namedDateTime");
    VerifierSettings.AddNamedTime(new(1, 1), "namedTime");
    VerifierSettings.AddNamedDate(new(2030, 1, 1), "namedDate");
    VerifierSettings.AddNamedDateTimeOffset(new(new(2030, 1, 1)), "namedDateTimeOffset");
}
```
<sup><a href='/src/Verify.Tests/Serialization/SerializationTests.cs#L1146-L1157' title='Snippet source file'>snippet source</a> | <a href='#snippet-NamedDatesAndTimesGlobal' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


### Inferred Name

The name can be inferred from the variable name by omitting the name argument:

<!-- snippet: InferredNamedDateFluent -->
<a id='snippet-InferredNamedDateFluent'></a>
```cs
[Fact]
public Task InferredNamedDateFluent()
{
    var namedDate = new Date(1935, 10, 1);
    return Verify(
            new
            {
                value = namedDate
            })
        .AddNamedDate(namedDate);
}
```
<sup><a href='/src/Verify.Tests/DateScrubberTests.cs#L277-L291' title='Snippet source file'>snippet source</a> | <a href='#snippet-InferredNamedDateFluent' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->

Result: 

<!-- snippet: DateScrubberTests.InferredNamedDateFluent.verified.txt -->
<a id='snippet-DateScrubberTests.InferredNamedDateFluent.verified.txt'></a>
```txt
{
  value: namedDate
}
```
<sup><a href='/src/Verify.Tests/DateScrubberTests.InferredNamedDateFluent.verified.txt#L1-L3' title='Snippet source file'>snippet source</a> | <a href='#snippet-DateScrubberTests.InferredNamedDateFluent.verified.txt' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


## Custom Comparers

The following comparers can be overridden


### DateTime

Default Comparer:

<!-- snippet: DateTimeComparer -->
<a id='snippet-DateTimeComparer'></a>
```cs
class DateTimeComparer : IEqualityComparer<DateTime>
{
    public bool Equals(DateTime x, DateTime y) =>
        x == y &&
        x.Kind == y.Kind;

    public int GetHashCode(DateTime obj) =>
        obj.GetHashCode() + (int) obj.Kind;
}
```
<sup><a href='/src/Verify/Counter_DateTime.cs#L15-L25' title='Snippet source file'>snippet source</a> | <a href='#snippet-DateTimeComparer' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->

Custom Comparer:

<!-- snippet: CustomDateTimeComparer -->
<a id='snippet-CustomDateTimeComparer'></a>
```cs
[ModuleInitializer]
public static void UseCustomDateTimeComparer() =>
    Counter.UseDateTimeComparer(new CustomDateTimeComparer());

public class CustomDateTimeComparer :
    IEqualityComparer<DateTime>
{
    public bool Equals(DateTime x, DateTime y) =>
        new DateTime(x.Year, x.Month, x.Day) ==
        new DateTime(y.Year, y.Month, y.Day);

    public int GetHashCode(DateTime date) =>
        new DateTime(date.Year, date.Month, date.Day).GetHashCode();
}
```
<sup><a href='/src/StaticSettingsTests/CustomDateCompareTests.cs#L4-L21' title='Snippet source file'>snippet source</a> | <a href='#snippet-CustomDateTimeComparer' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


### DateTimeOffset

Default Comparer:

<!-- snippet: DateTimeOffsetComparer -->
<a id='snippet-DateTimeOffsetComparer'></a>
```cs
class DateTimeOffsetComparer :
    IEqualityComparer<DateTimeOffset>
{
    public bool Equals(DateTimeOffset x, DateTimeOffset y) =>
        x == y && x.Offset == y.Offset;

    public int GetHashCode(DateTimeOffset obj) =>
        obj.GetHashCode() + (int) obj.Offset.TotalMinutes;
}
```
<sup><a href='/src/Verify/Counter_DateTimeOffset.cs#L15-L25' title='Snippet source file'>snippet source</a> | <a href='#snippet-DateTimeOffsetComparer' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->

Custom Comparer:

<!-- snippet: CustomDateTimeOffsetComparer -->
<a id='snippet-CustomDateTimeOffsetComparer'></a>
```cs
[ModuleInitializer]
public static void UseCustomDateTimeOffsetComparer() =>
    Counter.UseDateTimeOffsetComparer(new CustomDateTimeOffsetComparer());

public class CustomDateTimeOffsetComparer :
    IEqualityComparer<DateTimeOffset>
{
    public bool Equals(DateTimeOffset x, DateTimeOffset y) =>
        new DateTimeOffset(new(x.Year, x.Month, x.Day)) ==
        new DateTimeOffset(new(y.Year, y.Month, y.Day));

    public int GetHashCode(DateTimeOffset date)
    {
        var dateTime = new DateTime(date.Year, date.Month, date.Day);
        return new DateTimeOffset(dateTime)
            .GetHashCode();
    }
}
```
<sup><a href='/src/StaticSettingsTests/CustomDateCompareTests.cs#L42-L63' title='Snippet source file'>snippet source</a> | <a href='#snippet-CustomDateTimeOffsetComparer' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


### TimeOnly

Default Comparer:

<!-- snippet: TimeComparer -->
<a id='snippet-TimeComparer'></a>
```cs
EqualityComparer<Time>.Default;
```
<sup><a href='/src/Verify/Counter_Time.cs#L14-L18' title='Snippet source file'>snippet source</a> | <a href='#snippet-TimeComparer' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->

Custom Comparer:

<!-- snippet: CustomTimeComparer -->
<a id='snippet-CustomTimeComparer'></a>
```cs
[ModuleInitializer]
public static void UseCustomTimeComparer() =>
    Counter.UseTimeComparer(new CustomTimeComparer());

public class CustomTimeComparer :
    IEqualityComparer<Time>
{
    public bool Equals(Time x, Time y) =>
        new Time(x.Hour, x.Minute, x.Second) ==
        new Time(y.Hour, y.Minute, y.Second);

    public int GetHashCode(Time date) =>
        new Time(date.Hour, date.Minute, date.Second).GetHashCode();
}
```
<sup><a href='/src/StaticSettingsTests/CustomDateCompareTests.cs#L23-L40' title='Snippet source file'>snippet source</a> | <a href='#snippet-CustomTimeComparer' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->