トークでは .netcore ピット何かをそのシステムの時刻とファイルパス
こんにちは、ジュニアパートナーこんにちはみんな、長い時間のために、最近忙しく作業と共有のものにも意味がありません。この週末に加えて、クラスの2日間。同社の新プロジェクトが開発する.netcoreに基づいており、開発プロセスでは、また、いくつかのピットを踏んで、事前の要約に2つのピットは、これら二つのピットは、Linux(CentOSの)下の互換性や窓について質問があります。当社の開発環境インタフェースは、いつものように実行するために最初に配備されているWindows環境を呼び出すが、Linux(CentOSの)環境下で展開し、これらの2つの問題があった、実際には、問題は単純です:システム時刻を取得し、8より少ない実際の時間時間;識別されるファイルのファイルパス名。ここでは実際には共有への簡単な解決策は、だ、あなたはユーザー.netcoreを開始するときに、それを共有するための非常に単純な理由は、ちょっと、迅速な効果を持つことができることを見たら!
A、8時間DateTime.Now少ない時間取得システム
.NETコアのLinux展開するプロジェクト、(ときCentOSの上に)、およびGet DateTime.Now矛盾のWindowsで、それに問題を見つけ、実際のシステム時間8時間未満の時間システムに到達するまでの時間を発見した、我々は初めてタイムゾーンの違いを考えます。インターネット検索、私はそこに、小さなパートナーの多くは、同じ問題に遭遇している次のように、対応する解決策を与えているが見つかりました:
具体的な理由:両方のLinuxとWindowsの両方のタイムゾーンで使用される別のタイムゾーンがあります。Linux:IANA 、 Windowsの場合:WindowsのタイムゾーンのID。これは究極の犯人です!
原因を見つけたら、それを解決するためにどのように?非常に単純な方法は、サードパーティのライブラリを使用することができ、実装上、まあ、IANAの最終的に均一な適用を離れて得ることはありません同じ2つのタイムゾーンを使用することです:NodaTime。次のように具体的なコードは次のとおりです。
/// <要約> ///現在の時刻を取得 /// </要約> /// <戻り値>システムの現在時刻を</戻り値> のpublic static GetSysDateTimeNowのDateTime() { 今インスタントSystemClock.Instance.GetCurrentInstant =() ; VAR shanghaiZone DateTimeZoneProviders.Tzdb = [ "上海のアジア/"]; 戻りnow.InZone(shanghaiZone).ToDateTimeUnspecified(); }
それはないですので、簡単に?
:実際には、我々はさまざまな方法があるだろう時間を使う、など、時間のフォーマット変換の多くを行います。YYYY-MM-DD HH:MM:SS形式の時刻、時間およびタイムスタンプの変換などがあります。標準の動作を統一するためには、実際のプロジェクトでは、我々は実際の時間に応じて動作はもちろん、多くの目にはあまり技術的な内容ではないですが、また、ああ、その目的は、統一された制御を達成することである、利便性、統一されたパッケージを実行するために必要な管理、コードの再利用性を向上させます。必要に応じて、ダウンブロックすることができ、Nuget、パッケージ名(XYH.Tools.DateTimeTools)の上に置く、今、私はまた、必要であれば、あなたはを参照することができ、コードを掲示し、私はまた、バッグを生成します使用しています。
私はソースにアップロードしたダウン提出することができ、私たちが興味を持っている、GitHubの上
送信元アドレス: https://github.com/xuyuanhong0902/XYH.Tools.git
出典:
/ * ================================================ ============================== *機能説明:コレクションの時間に関連するすべての操作 練習マイクロへの旅交換プログラム:*作成者信号:15908150902 *作成日:2020年3月8日 * CLRバージョン:1.0 * ================================ * ============================================== / 使用NodaTime ; システムを使用して; /// <まとめ> ///共通ヘルプクラス /// </要約> 名前空間XYH.Tools.DateTimeTools { /// <まとめ> ///時間関連のアクションクラス /// </要約> パブリック静的クラスDateTimeTools { いくつかのシステム(戻り時間+時間フォーマットされた文字列)の現在時刻を取得する#region方法 /// <要約> ///現在の時刻を取得します /// </要約> /// <戻り値>システムの現在時刻</戻り値> のpublic static GetSysDateTimeNowのDateTime() { インスタントSystemClock.Instance.GetCurrentInstant = NOW(); VAR shanghaiZone DateTimeZoneProviders.Tzdb = [ "アジア/上海の" ]; 戻りnow.InZone(shanghaiZone).ToDateTimeUnspecified(); } /// <まとめ> ///現在の時刻を取得し、24時間形式の文字列は(YYYY-MM-DD HHとしてフォーマットされ: MM:SS .fff) /// </要約> /// <戻り値>現在のシステム時刻フォーマットされた文字列(MM-DD-YYYY HH:MM:ss.fff)</戻り> パブリック静的文字列GetSysDateTimeNowStringYMD24HMSF() { リターンGetSysDateTimeNow()。ToStringYMD24HMSF(); } /// <まとめ> /// 12時間形式の文字列内の現在の時間(:MM ss.fff MM-DD-YYYY HH)としてフォーマットされている取得 /// </要約> フォーマット/// <戻り値>現在のシステム時間列(MM-DD-YYYY HH:MM:ss.fff)</戻り> パブリック静的文字列GetSysDateTimeNowStringYMD12HMSF(この日時時間) { 。GetSysDateTimeNowリターン()ToStringYMD12HMSF(); } /// <まとめ> // /取得現在時刻24時間形式の文字列が(MM-DD-YYYY HH:MM:SS)としてフォーマットされ /// </要約> /// <戻り値>現在のシステム時間(文字列フォーマットMM-DD-HH YYYY:MM:SS)</戻り> パブリック静的文字列GetSysDateTimeNowStringYMD24HMS(この日時時間) { リターンGetSysDateTimeNow()ToStringYMD24HMS();. } /// <要約> /// 12時間形式文字列内の現在時刻としてフォーマットされ受ける(MM-DD-YYYY HH:MM:SS) /// </要約> /// <戻り値>現在のシステム時刻フォーマットされた文字列(MM-DD-YYYY HH:MM:SS)</戻り> パブリック静的文字列GetSysDateTimeNowStringYMD12HMS(この日時時間) { GetSysDateTimeNowリターン()ToStringYMD12HMS(); } /// <まとめ> ///現在時刻が文字列形式(YYYY-MM-DD)としてフォーマットされている取得 /// </要約> /// <戻り値>現在のシステム時刻フォーマットされた文字列(YYYY-MM-DD) </戻り値> 公共の静的な文字列GetSysDateTimeNowStringYMD(DateTime値の時間) { リターンGetSysDateTimeNow()ToStringYMD(); } #Endregion /// <戻り値>フォーマットされた文字列の時間(YYYY-MM-DD HH:MM:ss.fff)</復帰> #region日時のいくつかの拡張フォーマット方法 /// <まとめ> /// 24時間形式は次のようにフォーマットされている(MM-DD-YYYY HH:MM:ss.fff) /// </要約> /// <PARAM名= "時間" >時間形式は</ PARAM>である </戻り> /// <戻り値>形式の文字列の時間(ss.fff:MM:MM-DD-YYYY HH) パブリック静的文字列ToStringYMD24HMSF(この日時時間) { time.ToStringリターン( "MM-DD-YYYY HH:MM:ss.fff"); } /// <まとめ> /// 12時間形式を(YYYY-MM-DD HHとして書式設定され: MM :ss.fff) /// </要約> ///ます。<param name = "時間">フォーマットされた時間</ param>の パブリック静的文字列ToStringYMD12HMSF(この日時時間) { 戻りtime.ToString( "YYYY-MM-DD HH:MM:ss.fff")。 } /// <要約> /// 24時間形式は次のようにフォーマットされている(MM-DD-YYYY HH:MM:SS) /// </要約> /// <PARAM名= "時刻">フォーマット時間</ PARAM> /// <戻り値>形式の文字列の時間(MM-DD-YYYY HH:MM:SS)</戻り> パブリック静的文字列ToStringYMD24HMS(この日時時間) { 戻り時間。 ToStringメソッド( "MM-DD-YYYY HH:MM:SS"); } /// <まとめ> /// 12時間形式は次のようにフォーマットされている(MM-DD-YYYY HH:MM:SS) // / </要約> ///ます。<param name = "時間">フォーマットされた時間</ param>の /// <戻り>フォーマットされた文字列の時間(YYYY-MM-DD HH:MM:SS)</復帰> パブリック静的文字列ToStringYMD12HMS(この日時時間) { 戻りtime.ToString( "YYYY-MM-DD HH:MM:SS")。 } /// <要約> ///フォーマットは時間(YYYY-MM-DD)としてフォーマットされ /// </要約> /// <PARAM NAME = "時間">フォーマットされた時間</ PARAM> /// <リターン>列時間(YYYY-MM-DD)< /戻り> フォーマット パブリック静的文字列ToStringYMD(この日時時間) { 戻りtime.ToString( "MM-DD-YYYY"); } # endregionの #regionは、タイムスタンプ取得 /// <要約> ///取得タイムスタンプ(秒) /// </要約> /// <戻り値>第二のタイムスタンプ</戻り値> のpublic staticロングGetSecondTimestamp() { //にします現在のシステム時刻の差から始まる二度目の1970年1月1日は、第二のタイムスタンプです TS = GetSysDateTimeNowのTimeSpan() -日時の新しい新しい(1970 ,. 1 ,. 1、0、0、0、0); 戻りConvert.ToInt64(ts.TotalSeconds); } /// <まとめ> ///取得タイムスタンプ(ミリ秒単位) /// </要約> /// <戻り値>ミリ秒のタイムスタンプ</戻り> パブリック静的ロングGetMilliSecondTimestamp() { 開始1970年1月1日現在の時刻までの時間差として//ミリ秒同じシステムミリ秒でありますスタンプ のTimeSpan GetSysDateTimeNow = TS() -新しい新規のDateTime(1970 ,. 1 ,. 1、0、0、0、0); 戻りConvert.ToInt64(ts.TotalMilliseconds); } #endregion タイムスタンプがAに変換され#region /// <まとめ> ///変換する第2のタイムスタンプ形式の時間(秒) /// </要約> ///ます。<param name = "secondTimestamp">第二のタイムスタンプ</ param>の /// <戻り値>時間</戻り値>変換 のpublic static DateTimeの?SecondStampToDateTime(ロングsecondTimestamp) { /簡単に作る/決意 (secondTimestamp <= 0)IF { 戻りNULL; } //対応する時間を計算するためにどのとの時間差を算出することにより、1970年1月1日に開始時刻 のdateTimeのdateTimeを=新しい可能System.DateTime (1970 ,. 1 ,. 1、0、0、0、0); たdateTime = dateTime.AddSeconds(secondTimestamp).ToLocalTimeは(); 戻りのdateTime; } /// <まとめ> ///は、第二のタイムスタンプ形式の文字列(秒)に変換します /// </要約> /// <PARAM NAME = "secondTimestampStr" > 秒の列のタイムスタンプ</ param>の /// <戻り値>時間を変換</戻り値> のpublic static DateTimeの?SecondStampToDateTime(文字列secondTimestampStr) { //それが空である場合には、次いで直接リターンヌル IF(String.IsNullOrEmpty(secondTimestampStr)) { 戻りNULL; } //最初の文字列は、デジタルタイムスタンプに変換される ロングsecondTimestamp = 0; long.TryParse(secondTimestampStr、secondTimestamp OUT); //呼び出しがする SecondStampToDateTimeを返します( secondTimestamp); } /// <概要> ///は(MS)ミリ秒タイムスタンプ形式に文字列を変換する /// </要約> ///ます。<param name = "secondTimestampStr" > ミリ秒のタイムスタンプ文字列</ param>の /// <戻り値>時間</戻り値>変換 のpublic static DateTimeの?MilliSecondStampToDateTime(ロングsecondTimestamp) { //簡単な操作を行います分析 IF(secondTimestamp <= 0) { 戻りヌル; } 対応する時間を計算すると、時間差算出することにより、// 1970年1月1日に開始時刻 のdateTimeたdateTime =新規のSystem.DateTime(1970、 1、 。1、0、0、0、0); たdateTime = dateTime.AddMilliseconds(secondTimestamp).ToLocalTime(); 戻り日時; } /// </要約> /// <要約> ///は、タイムスタンプ形式ミリ秒(ミリ秒)に変換される ///ます。<param name = "milliSecondStampStr" > ミリ秒のタイムスタンプ</ param>の /// <戻り値>時間</戻り値>変換 のpublic static DateTimeの?MilliSecondStampToDateTime(文字列milliSecondStampStr) { //それが空の場合、直接的であれば戻りヌル IF(String.IsNullOrEmpty(milliSecondStampStr)) { 戻りヌル; } //文字列は最初のデジタルタイムスタンプに変換される ロングmilliSecondStamp = 0; long.TryParse(milliSecondStampStr、milliSecondStamp OUT); //呼び出しに MilliSecondStampToDateTime(milliSecondStamp)を返します; } #endregion } }
第二に、識別されるファイルのファイルパス名
ハハ、最近、ある興味深い、遭遇した、Windowsの、創造のファイルパス上に正しいですが、ファイルを作成し、CentOSのを展開する、すべてのパスは、ルート内のすべてのファイルのファイル名となっていますディレクトリ。
インターネットは、その理由を見つけるために、左と右のスラッシュスラッシュ問題へのファイルパスです。Windows、Linuxでのみ右スラッシュ、操作に使用されるコードでパスを左または右スラッシュスラッシュ、何の問題が、サポートのいずれか、統一されたスラッシュを変更する権利を持って、問題が解決されます。ファイルパス1/2ファイルパス/ファイル名
第三に、要約
これらの2つの問題振り返ってみると、互換性の問題は慎重に、体系的には約、この問題へのファイルパスが、我々はスラッシュを使用してに慣れるために持っている場合は特に、常習的な問題だと思います。
我々は書きます、.NETプログラムは、関係なく、それは.netcoreのLinuxシステムの展開の使用を実装するかどうかの、我々はまた、異なるシステムの互換性を考える必要があるときに、後のプロジェクトをやって、達成するための一般的な方法の実現に使用されています、移動時間をアップグレードし、それはあまりトラブルになります。ねえ、私はあなたとピット上の他の.netcore本当のステップを共有従って、今日この上にハングアップします。お読みいただきありがとうございました。