2010-07-09 4 views
10

Предполагая, что у вас есть временная метка Unix, что было бы простым и/или элегантным способом проверить, была ли эта временная метка вчера?Элегантно проверьте, установлена ​​ли данная дата вчера

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

ответ

8

PHP:

$isYesterday = date('Ymd', $timestamp) == date('Ymd', strtotime('yesterday')); 
16

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

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

+0

Это работает только тогда, когда метка времени была в полночь точно. Редактировать: работает с <= хотя :) Редактировать 2: проигнорируйте это, это работает: P – Aistina

+3

Нет. И свойства Today и Date возвращают только часть даты даты-времени, когда часть времени равна нулю. Поэтому он должен работать нормально. –

-1

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

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; 
} 
+0

Пожалуйста, отредактируйте, чтобы указать, на каком языке это. – Jolta

2

Это принимает необязательный 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

Другой C# пример:

bool isYesterday = DateTime.Now.Date.AddDays(-1) == dateToCheck.Date; 
+4

Почему так негативно? :-) Я бы написал, что как: 'bool isYesterday = dateToCheck.Date.AddDays (1) == DateTime.Today;' –

+2

@Omer Mor lol это просто мой пессимизм, показывающий через;) – w69rdy

2

Код:

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"); 
    } 
} 
3

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

bool isYesterday = (dateToCheck.AddDays(1) > DateTime.Now.Date); 
5

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

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

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

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

1

В JavaScript, вы могли бы написать

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

Вышедшие ненужные детали реализации, но это возможно.Хорошо, there ya go :)

(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 
    }); 
})(); 
3

Пример в Smalltalk с использованием Pharo/Squeak

(Date year: 2014 month: 4 day: 24) = Date yesterday 
1

C#

TimeSpan difference = DateTime.Now.Date - olderDate.Date; 
    bool isYesterday = difference.TotalDays == 1; 
Смежные вопросы