2014年08月06日

C#で指定された日の存在する週を求める

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その31

■問題
年、月、日を入力すると、指定された日の存在する週の月曜日から金曜日までを 出力するコードを書いてください。 週が月や年をまたぐケースが正しく動いているかに気をつけて投稿してください。
このお題は匿名での投稿をもとに作成しました。ご投稿ありがとうございます。

作成したGetWeekDaysメソッドは、与えられた日が存在する週の月曜日から金曜日までに日にちを列挙するメソッドです。
DayOfWeek列挙体の値の範囲は 0 (DayOfWeek.Sunday) 〜 6 (DayOfWeek.Saturday) なので、 現在の日から、DayOfWeek列挙体の値(intにしたもの)を引けば、日曜日が求まります。
これが求まれば、月曜日から金曜日を求めるのは簡単ですね。
DateTime構造体を使ってるので、月や年をまたぐケースは特に意識する必要はないです。 

PrintWeekDaysメソッドは、このGetWeekDaysメソッドを呼び出した結果を出力しています。

■C#で書いたコード

using System; using System.Collections.Generic; using System.Linq; namespace Doukaku.Org { class Program { static void Main(string[] args) { PrintWeekDays(new DateTime(2013,9, 27)); Console.WriteLine(); PrintWeekDays(new DateTime(2013, 11, 1)); Console.WriteLine(); PrintWeekDays(new DateTime(2013, 12, 31)); Console.WriteLine(); Console.ReadLine(); } static void PrintWeekDays(DateTime date) { var days = GetWeekDays(date).ToList(); days.ForEach(dt => Console.WriteLine(dt.ToString("yyyy/MM/dd (ddd)"))); } static IEnumerable<DateTime> GetWeekDays(DateTime date) { // 日曜日の日を求める int dow = (int)date.DayOfWeek; date = date.AddDays(-dow); // 月から金までを返す for (int i = 1; i < 6; i++) yield return date.AddDays(i); } } }
  

Posted by gushwell at 23:00Comments(0)TrackBack(0)

2014年07月27日

C#で文字列型日時のN秒後時間取得

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その28

■問題 (出題者:raynstard)
日時を表す文字列と時間(秒)を受け取り
指定された日時からN秒となる日時を出力する関数 DateEx() を作成してください。

関数の仕様は次の通りです。
1. 入力となる日時の書式は任意である。
    → プログラムの都合に合わせてよい。
2. 入力となる時間(秒)は、負の値も許容すること。
    また、負の値が指定された場合、指定の日時よりも前の日時を出力すること
3. 出力する日時は入力の日時と同じ書式をとる文字列であること
4. 出力する日時は正規化されていること
5. 出力先は標準出力、または、バッファのいずれでもよい。

たとえば、DateEx("20080827235925",40)ならば
出力は
「20080828000005」です。

余力があれば時間を省略可能とし、省略された場合は「現在時刻」を利用するように
してみてください。

入力となる日時の書式は、yyyy/MM/dd HH:mm:ss とします。 DateTime.Parse使ってるので、DateTime.Parse が受け付ける書式なら何でも良いのですが、 出力はひとつに固定です。
そういう意味では、3を満足していないともいえますが、まあ、そこはご愛嬌ということで...

正規表現使って、日時を取り出し、それを DateTime型に変換するという方法もあるとおもいますが、 それだと、めんどうなので、素直に、DateTime.Parse 使いました。
入力書式があってるのが前提条件です。

■C#で書いたコード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Doukaku.Org {

    class Program {
        static void Main(string[] args) {
            Console.WriteLine(DateEx("2008/08/27 23:59:25", 40));
            Console.WriteLine(DateEx("", 40));
        }

        static string DateEx(string date, int n) {
            DateTime dt = string.IsNullOrEmpty(date) ? DateTime.Now : DateTime.Parse(date);
            DateTime dt2 =  dt.AddSeconds(n);
            return string.Format("{0:yyyy/MM/dd HH:mm:ss}", dt2);
        }
    }
}
  
Posted by gushwell at 21:30Comments(0)TrackBack(0)

2014年06月25日

C#で西暦から和暦変換

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その19

■問題 (出題者:ocean さん)
西暦を和暦に変換するプログラムを書いてください。元号の切り替わる日など、
複数の表記が可能な場合には両方表示し、西暦が無効な日付の場合には「範囲外」と
表示するようにしてください。対応すべき日付は明治元年以降とします。

>a.py 1868/12/2
明治1年12月2日

>a.py 1926/12/24
大正15年12月24日

>a.py 2007/12/01
平成19年12月1日

>a.py 1926/12/25
大正15年12月25日 昭和1年12月25日

>a.py 1868/1/2
範囲外

>a.py 1868/100/2
範囲外

「複数の表記が可能な場合には両方表示し」という要求を満たすコードの部分では、元号を漢字2文字に限定したコードとしています。

■C#で書いたコード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            // あくまでもJapaneseCalendar を使うことにこだわったコード
            while (true) {
                string s = Console.ReadLine();
                try {
                    CultureInfo culture = new CultureInfo("ja-JP", true);
                    culture.DateTimeFormat.Calendar = new JapaneseCalendar();
                    DateTime datetime = DateTime.Parse(s);

                    string s1 = datetime.ToString("ggy年M月d日", culture);
                    string s2 = datetime.AddDays(-1).ToString("ggy年M月d日", culture);
                    if (s1.Substring(0, 2) != s2.Substring(0, 2))
                        s1 += " " + s2.Substring(0, 2) + s1.Substring(3);
                    Console.WriteLine(s1);
                } catch {
                    Console.WriteLine("範囲外です");
                }
            }
        }
    }
}
  
Posted by gushwell at 23:00Comments(0)TrackBack(0)

2014年05月18日

C#でミリ秒まで含んだ時刻文字列を生成

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その8

■問題 (出題者:znzさん)
YYYY年mm月dd日HH時MM分SS.xxx秒なら、「YYYYmmddHHMMSS.xxx」のようにミリ秒まで含んだ文字列を返すプログラムを書いてください。

書式設定って、時分秒までは覚えていても、ミリ秒(fff)までは覚えてないです (^^;

■C#で書いたコード
using System;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine(GetDateString(DateTime.Now));
        }

        static string GetDateString(DateTime date) {
            return date.ToString("yyyyMMddHHmmss.fff");
        }
    }
}
  
Posted by gushwell at 22:30Comments(0)TrackBack(0)