質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • C#

    6549questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • DateTime

    42questions

    多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

C# DateTimeで過去直近??:00時の変数を作りたい

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 196

hellokato

score 4

C#のDateTimeで最後の??:00時の変数を作りたいです。(??は可変)

13:00の変数を作る場合、
今が14日の12:00なら、2018/6/13 13:00
今が14日の14:00なら、2018/6/14 13:00
のようにしたいのですが、スマートなやり方がわかりません。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • YAmaGNZ

    2018/06/14 13:37

    スマートじゃないやり方が分かっているのでしょうから、それを提示し、これよりスマート(何を持ってスマートとすべきかもありますが)なやり方を聞くべきかと思います。

    キャンセル

回答 5

checkベストアンサー

0

質問の内容を間違えて読み取ってしまったので修正します。
今日のN時か昨日のN時かを返せば良いと思います。

        private void button1_Click(object sender, EventArgs e)
        {
            Test(2018, 6, 14, 12, 13);
            Test(2018, 6, 14, 14, 13);
        }

        internal static void Test(int nYear, int nMonth, int nDay, int nHour, int nTargetHour)
        {
            var target = new DateTime(nYear, nMonth, nDay, nHour, 0, 0);
            Debug.WriteLine($"{target} の直近の {nTargetHour:00}:00 は {GetPastLatestHour(target, nTargetHour)}");
        }

        internal static DateTime GetPastLatestHour(DateTime target, int nHour)
        {
            var sameDay = new DateTime(target.Year, target.Month, target.Day, nHour, 0, 0);

            if (sameDay <= target)
            {
                return sameDay; // 同じ日のnHour時
            }
            return sameDay - TimeSpan.FromDays(1); // 一日前のnHour時
        }

出力:

2018/06/14 12:00:00 の直近の 13:00 は 2018/06/13 13:00:00
2018/06/14 14:00:00 の直近の 13:00 は 2018/06/14 13:00:00

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/14 15:47

    教えて頂き、ありがとうございます!!
    処理量と読み解きやすさのバランスが最も私の好みでした!

    キャンセル

0

現在時刻が午前0時台だった場合でも、正しく前日23:00を取得できる方法です。

DateTime t = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, 0, 0) - TimeSpan.FromHours(1);

ご参考になれば。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

int SetHour = 13;
DateTime target, t;

target = DateTime.Parse("2018/06/14 12:00:00");
t = target.Date.AddHours(SetHour).AddDays((target.Date.AddHours(SetHour) < target) ? 0 : -1);
Console.WriteLine(t.ToString());

target = DateTime.Parse("2018/06/14 14:00:00");
t = target.Date.AddHours(SetHour).AddDays((target.Date.AddHours(SetHour) < target) ? 0 : -1);
Console.WriteLine(t.ToString());


こういう手もありかと

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ちょっとした頭の体操ですね。

int lastHour = 13;
DateTime now = DateTime.Now;
DateTime justHour = new DateTime((now.Ticks / TimeSpan.TicksPerHour) * TimeSpan.TicksPerHour);
DateTime justHourLast = justHour - new TimeSpan(((justHour.Hour < lastHour) ? 24 : 0) + justHour.Hour - lastHour, 0, 0);

// より短いのを追記しました。
DateTime justHourLast2 = justHour - new TimeSpan((24 + justHour.Hour - lastHour) % 24, 0, 0);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/14 15:56

    教えて頂き、ありがとうございます!!
    非常に短コードです!やってる事の計算を読み解くのに苦労しました^^;

    キャンセル

0

スマートかどうかはわかりませんが、シンプルに書きたいのであれば
拡張クラス作って

public static class DateTimeExtension
{
    public static DateTime PrevTime(this DateTime Now, TimeSpan TimeSpan)
    {
        return Now.Date - (Now.TimeOfDay > TimeSpan ? TimeSpan.Zero : TimeSpan.FromDays(1)) + TimeSpan;
    }
}


こんな感じに呼び出してみてはいかがでしょうか?

var TargetTime = TimeSpan.Parse("13:00");
var resultTime1 = DateTime.Parse("2018/05/24 12:14").PrevTime(TargetTime);
System.Diagnostics.Debug.WriteLine(resultTime1);
var resultTime2 = DateTime.Parse("2018/05/24 13:54").PrevTime(TargetTime);
System.Diagnostics.Debug.WriteLine(resultTime2);
2018/05/23 13:00:00
2018/05/24 13:00:00

何度も呼ぶのであれば TimeSpan.FromDays(1) は static readonly なTimeSpanにした方がいいかもしれませんが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/14 15:52

    教えて頂き、ありがとうございます!!
    スマートです!!TimeOfDayの存在を初めて知りました!感謝感激です!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Python3で西暦の下2桁を出力する方法

    Pythonを学んでいる初心者です。 あるサイト(コードガールこれくしょん)の問題ですが、 回答に困っています。 どなたかお助けください! 問題:下のコードを修正して、今年

  • 解決済

    SQLにおける日時検索

    毎日毎時間10分単位で時間と風向・風量を測定しDBに記録をしていく様な、添付した画像のテーブルがあります。 そこで質問ですが、このテーブルから 「30分毎のレコード」や「

  • 解決済

    python/pandas:2つの時系列データの統合 mearge_asof

     前提・実現したいこと ・以下のようなBookAのデータをBookBへ統合したい。 ・time_Bに最も近いtime_Aのvalue_AをBookBに統合したい。 ・±5分以内にデ

  • 解決済

    時刻帯でデータを集計する

    下記のようなデータフレームで異なる日付の列1,列2の値を時刻帯でまとめて集計したいです。 Datetimeindex型 列1 列2 2018-05-28 18:0

  • 解決済

    pandasでresampleしたデータの各開始時刻を、元データと揃えたい

     前提・実現したいこと          time          data   2018-06-01 00:03:00   0      2018-06-01

  • 解決済

    Pandasのキーワードで抽出

    create_at ... favorite_count 0 Wed Jul 01 08:42:39 +00

  • 受付中

    datetime型の計算について

    powershellを用いてSQL server management studioのあるテーブルからdatetime型の時間を2つ取得し、その2つの差を求めたいです。 例)時間А

  • 解決済

    日付のリストを自動生成したい

    サイトにアクセスしたタイミングから15ヶ月のリストを作ろうとしています、 リストは各月の1日で表示します 力技で近いことはできるのですが [f"{y}-{m:02d}-01"

同じタグがついた質問を見る

  • C#

    6549questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • DateTime

    42questions

    多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。