FC2ブログ

どこであろうと日本時間

アメリカにあるクラウド(サーバー)上に配置するアプリを開発した際、日本にある某DBの某テーブルの某列に、日付を設定する処理で、DateTime.Nowを使って設定していた。しかし、日本側からみると、アメリカ現地時間で設定されいるという問題になった。
対応策として、日本にあるDBのシステム日付を取得するようにしたんだけど、某同僚からクレームが。
同僚:めんどいっす!
俺:え?何が?
同僚:いちいちDBからシステム日付取るってのが効率悪いし、それを意識し続けて実装できないっす!
俺:そういわれてもなー・・・。
同僚:そもそも、日本時間だったら良いんだから、どうにかしてくださいっす!
俺:わかったっす!あ。
というわけで、まあちょちょいと調べたら、DateTimeOffsetを使う方法を発見。メソッドを作ってみた。
/// <summary>TimeZone(JST)</summary>
private static readonly TimeZoneInfo TIMEZONE_JST =
TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");

/// <summary>
/// (日本時間で)現在日時を取得します。<br/>
/// </summary>
/// <returns>(日本時間)現在日時</returns>
public static DateTime JpNow() {
return TimeZoneInfo.ConvertTime(DateTimeOffset.Now, TIMEZONE_JST).DateTime;
}

/// <summary>
/// (日本時間で)現在日を取得します。
/// </summary>
/// <returns>(日本時間)現在日</returns>
public static DateTime JpToday() {
return TimeZoneInfo.ConvertTime(DateTimeOffset.Now, TIMEZONE_JST).DateTime.Date;
}
試しに、PCの時刻をアメリカ東部標準時刻にして実行したら、日本の現在時刻になった。
まあ、前よりは使いやすいかな。
スポンサーサイト



当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

文字列比較で今更な話

同じ課の後輩から、久しぶりに質問が来た。

後輩:ちょっと良いっすか?
俺:いつでも良いよ。今駄目ならいつも駄目だし。

当時は手がけていた仕事が行き詰っていて、常に忙しかったので、逆にいつでも外からの質問を受け付ける方針にしていた。どんな仕事でも、気分転換は必要である。

後輩:文字列の比較でなんか変なことになってるっす。
俺:今更文字列の比較で変になってるっすか。
後輩:今更、と言われても、変なものは変なんすよ

どうも、彼は欧州向けのシステム開発に従事していて、とあるデータ連携バッチで問題になっているそうで。
欧州では、「ä(ウムラウトa)」や「ß(エスツェット)」のような独特の文字があり、扱えない時はアルファベットで代替する。
例えば、ミュンヘンは、ドイツ語で「München」で、「ü」を扱えないときは、「Muenchen」で代替表記する。

後輩:で、stringのCompareToメソッドで比較するとですね、「ß」と「ss」が同じ文字列扱いされるんっすよ。
俺:え。マジで?
後輩:ええ、マジで。だから困っているし、こうして相談してるんじゃないっすか。

調べてみると、実際そうだった。
var text1 = "Masse";
var text2 = "Maße";
var equal1 = text1 == text2; //false
var equal2 = string.Equals(text1, text2);//false
var compare1 = text1.CompareTo(text2);//0 (!!)

俺:ほんとだ。
後輩:でしょ?
俺:なんて、おおきなお世話なんだ。
後輩:ですよねぇ(苦笑)。

まあ、仕様を理解せずに使っているが為の文句を言ってもしょうがないので、.NET の文字列を使用するためのベスト プラクティスで調べてみた。それによれば、「現在カルチャの規則に依存したくないなら、StringComparisonのOrdinalを使え」と書いてある。
ということは、Compareメソッドのオプションをそうするか、CompareOrdinalメソッドを使えば良いということか。
var compare2 = string.Compare(text1, text2); //0
var compare3 = string.Compare(text1, text2, StringComparison.Ordinal);//0以外
var compare4 = string.CompareOrdinal(text1, text2);//0以外
ソートするときは、CmpareToメソッド、比較するときは、CompareOrdinalメソッドか。使い分けめんどくさいぞ。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

C#5もぼちぼちなんだが。

What's New in C# 6
What's new in C# 7
ユーザーさんたちが使うPCの一部では、まだWindows7が現役だったりするのもあるし、一度リリースしたら、おいそれと変えられないという事情で、仕事では、.NET4 Framwwork(C#4)がメインだったりする。まあしかし、勉強しても損ではないし。使わずともどんな使い方になるかを読んでおくべきかな。
しかし、C#を1.1から勉強する新人さんたちは大変だな。教える側も内容を考えないといけないな。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

文字列(操作)のあれこれ(弐)

文字列のあれこれ。の不足分を埋める感じで。よく仕事で使うやつをメモしておく。

〇文字列内の検索。場所を特定したいなら、IndexOf。含まれているかどうかだけなら、Contains。
var index = targetText.IndexOf("a");//1
var contains = targetText.Contains("Sh");//True
IndexOfよりContainsをよく使うかな。

〇文字列内の検索。特定文字列で始まる、あるいは終わるかどうか。
ファイル名や、拡張子をチェックするのに重宝している。
var targetText = "Tawamuredays With C Sharp.";
var start = targetText.StartsWith("Tawamu");//true
var ends = targetText.EndsWith("day");//false

〇分割
var pgLangs = "C#,Java,PHP,JavaScript,D,Python,なでしこ";
var elements = pgLangs.Split(',');
改行コードで分割することよくある。

〇文字列の比較(等値)
staticメソッドなので、nullかどうかを意識せずに使えるかな。
var isEqual = string.Equals(null, "");//false
ああでも、普通に「==」で比較すれば良い話かもしれない…。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

時代の流れでコードの書き方も変わる

仕事では、.NET4(VS2010)をIDEとして使っている関係上、C#5以降の機能を使うことはできない。
最初の頃に書いたコードに、ToStringというユーティリティメソッドがある。
クラスはシンプルが良い(Utility編)
このユーティリティメソッドは、Java時代からの長い付き合いである。
これをC#6.0風に書くと、こんな感じになるだろうか。
public static class StringUtil {

/// <summary>
/// 引数オブジェクトを文字列で返します。nullなら空文字列が返されます。
/// </summary>
/// <typeparam name="T">引数オブジェクトのタイプ</typeparam>
/// <param name="obj">オブジェクト</param>
/// <returns>文字列</returns>
public static string ToString<T>(T obj) {
return obj?.ToString() ?? string.Empty;
}
}
?が3つもあるが、一行で書けたりする。開発環境もそろそろVS2015に移行する時期なんだろうな。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m