Изящно проверьте, ли данная дата вчера

Принятие Вас имеет метку времени Unix, каков был бы легкий и/или изящный способ проверить, прошла ли та метка времени вчера некоторое время?

Я главным образом ищу решения в JavaScript, PHP или C#, но псевдо код и решения агностика языка (если таковые имеются) приветствуются также.

11
задан Aistina 9 July 2010 в 10:53
поделиться

9 ответов

PHP:

$isYesterday = date('Ymd', $timestamp) == date('Ymd', strtotime('yesterday'));
9
ответ дан 3 December 2019 в 01:02
поделиться

В C # вы можете использовать это:

bool isYesterday = DateTime.Today - time.Date == TimeSpan.FromDays (1);

19
ответ дан 3 December 2019 в 01:02
поделиться

В псевдокоде для сравнения временных меток:

  1. получить текущую метку времени Unix
  2. преобразовать полученную метку времени в дату
  3. вычесть 1 день из даты
  4. преобразовать метку времени для проверки в дату
  5. ] сравните обе даты. Если они равны, проверенная временная метка была вчера.

Следите за часовыми поясами, если вы показываете результаты пользователю. Для меня сейчас 13:39 9 июля 2010 года. Метка времени 14 часов назад для меня - вчера. Но для кого-то в другом часовом поясе, где сейчас 15:39, 14 часов назад было не вчера!

Другой проблемой может быть неправильная установка времени / даты в системе. Например, если вы используете JavaScript и системное время компьютера посетителей неверно, программа может прийти к неверному выводу. Если важно получить правильный ответ, получите текущее время из известного источника с правильным временем.

5
ответ дан 3 December 2019 в 01:02
поделиться

Еще один пример на C#:

bool isYesterday = DateTime.Now.Date.AddDays(-1) == dateToCheck.Date;
2
ответ дан 3 December 2019 в 01:02
поделиться

Вы можете использовать это в C#:

bool isYesterday = (dateToCheck.Date.AddDays(1) == DateTime.Now.Date);
5
ответ дан 3 December 2019 в 01:02
поделиться

В JavaScript вы можете написать

var someDate = new Date(2010, 6, 9);
Date.yesterday.date == someDate.date // true

Опуская ненужные детали реализации, но это возможно. Хорошо, вот и все :)

(function() {
    function date(d) {
        var year = d.getFullYear();
        var month = d.getMonth();
        var day = d.getDate();
        return new Date(year, month, day);
    }

    Object.defineProperty(Date, 'yesterday', {
        enumerable: true,
        configurable: false,
        get: function() {
            var today = new Date();
            var millisecondsInADay = 86400000;
            var yesterday = new Date(today - millisecondsInADay);
            return yesterday;
        },
        set: undefined
    });​​​​​​​​

    Object.defineProperty(Date.prototype, 'date', {
        enumerable: true,
        configurable: true,
        get: function() {
            return date(this).valueOf();
        },
        set: undefined
    });
})();
1
ответ дан 3 December 2019 в 01:02
поделиться

Код:

static class ExtensionMethods
{
    private static readonly DateTime UnixStart = new DateTime(1970, 1, 1, 0, 0, 0, 0);;

    public static bool IsYesterday(this int unixTime)
    {
        DateTime convertedTime = UnixStart.AddSeconds(unixTime);
        return convertedTime.Date == DateTime.Now.AddDays(-1).Date;
    }

    public static bool IsYesterday(this DateTime date)
    {
        return date.Date == DateTime.Now.AddDays(-1).Date;
    }
}

Примеры:

public class Examples
{
    public void Tests()
    {
        if (1278677571.IsYesterday()) System.Console.WriteLine("Is yesterday");

        DateTime aDate = new DateTime(2010, 12, 31);
        if (aDate.IsYesterday()) System.Console.WriteLine("Is yesterday");
    }
}
2
ответ дан 3 December 2019 в 01:02
поделиться

Он принимает необязательный объект DateTimeZone . Если он не указан, используется текущий часовой пояс по умолчанию.

<?php
function isYesterday($timestamp, $timezone = null) {
    $t = new DateTime(null, $timezone);
    $t->setTimestamp($timestamp);
    $t->setTime(0,0);
    $yesterday = new DateTime("now", $timezone);
    $yesterday->setTime(0,0);
    $yesterday = $yesterday->sub(new DateInterval('P1D'));

    return $t == $yesterday;
}
2
ответ дан 3 December 2019 в 01:02
поделиться

Вы можете попробовать эту функцию:

public bool IsFromYesterday(long unixTime) {
    DateTime convertedTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    convertedTime.AddSeconds(unixTime);

    DateTime rightNow = DateTime.Now;

    DateTime startOfToday = DateTime.Today;
    DateTime startOfYesterday = startOfToday - new TimeSpan(1, 0, 0, 0);

    if (convertedTime > startOfYesterday && convertedTime < rightNow)
        return true;
    else
        return false;
 }
-1
ответ дан 3 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: