unsigned long getMillisecondsSinceUnixEpoch(DateTime dt) {
   unsigned long seconds = 0;

   // Get everything as seconds first
   seconds += dt.second;
   seconds += dt.minute * SECONDS_PER_MINUTE;
   seconds += dt.hour * SECONDS_PER_HOUR;
   seconds += dt.day * SECONDS_PER_DAY;

   const unsigned int year = convertToFullYear(dt.partialYear);
   seconds += getDayCountUpToMonthWithYear(dt.month, year) * SECONDS_PER_DAY;
   seconds += getDayCountUpToYearSinceUnixEpoch(year) * SECONDS_PER_DAY;

   // And then convert seconds to millis and add in the remaining millis
   return seconds * MILLIS_PER_SECOND + dt.millisecond;
}
millis_t getMillisecondsSinceUnixEpoch(DateTime dt)
{
    if (!isValidDateTime(dt))
        return 0ll;

    millis_t seconds = 0;

    // Get everything as seconds first.  No changes since 0 based.
    seconds += dt.second;
    seconds += dt.minute * SECONDS_PER_MINUTE;
    seconds += dt.hour * SECONDS_PER_HOUR;

    // Subtract 1 from day since they start at 1 instead of 0.
    seconds += (dt.day - 1) * SECONDS_PER_DAY;

    seconds += getDayCountUpToMonthWithYear(dt.month, dt.year) * SECONDS_PER_DAY;
    seconds += getDayCountUpToYearSinceUnixEpoch(dt.year) * SECONDS_PER_DAY;

    // And then convert seconds to millis and add in the remaining millis
    return seconds * MILLIS_PER_SECOND + dt.millisecond;
}
unsigned int getDayCountUpToPartialYearSinceUnixEpoch(const unsigned int partialYear) {
   return getDayCountUpToYearSinceUnixEpoch(convertToFullYear(partialYear));
}