Unix タイムスタンプがあると仮定すると、そのタイムスタンプが昨日の時刻であるかどうかを確認する簡単かつ/またはエレガントな方法は何でしょうか?
私は主に Javascript、PHP、または C# でのソリューションを探していますが、疑似コードや言語に依存しないソリューション (もしあれば) も歓迎します。
Unix タイムスタンプがあると仮定すると、そのタイムスタンプが昨日の時刻であるかどうかを確認する簡単かつ/またはエレガントな方法は何でしょうか?
私は主に Javascript、PHP、または C# でのソリューションを探していますが、疑似コードや言語に依存しないソリューション (もしあれば) も歓迎します。
C# では、次のように使用できます。
bool isYesterday = DateTime.Today - time.Date == TimeSpan.FromDays(1);
これは C# で使用できます。
bool isYesterday = (dateToCheck.Date.AddDays(1) == DateTime.Now.Date);
PHP:
$isYesterday = date('Ymd', $timestamp) == date('Ymd', strtotime('yesterday'));
疑似コードでタイムスタンプを比較するには:
結果をユーザーに表示する場合は、タイムゾーンに注意してください。私にとっては、2010 年 7 月 9 日の 13:39 です。14 時間前のタイムスタンプは昨日です。しかし、現在 15:39 である別のタイムゾーンにいる人にとっては、14 時間前は昨日ではありません!
別の問題は、システムの時刻/日付の設定が間違っている可能性があります。たとえば、JavaScript を使用していて、訪問者の PC のシステム時刻が間違っていると、プログラムが間違った結論を出す可能性があります。正しい答えを得ることが不可欠な場合は、既知のソースから正確な時刻で現在の時刻を取得します。
これはオプションの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;
}
別の C# の例:
bool isYesterday = DateTime.Now.Date.AddDays(-1) == dateToCheck.Date;
コード:
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");
}
}
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
});
})();
この関数を試してみることができます。
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;
}