32

C#の日時を文字列に変換しています。後でそれをDateTimeオブジェクトに変換し直すと、それらは等しくないように見えます。

const string FMT = "yyyy-MM-dd HH:mm:ss.fff";
DateTime now1 = DateTime.Now;
string strDate = now1.ToString(FMT);
DateTime now2 = DateTime.ParseExact(strDate, FMT, CultureInfo.InvariantCulture);
Console.WriteLine(now1.ToBinary());
Console.WriteLine(now2.ToBinary());

これが例です。すべてが文字列形式で含まれているように見えます。日付を印刷すると両方とも同じように表示されますが、オブジェクトを比較したり、日付をバイナリ形式で印刷したりすると、違いがわかります。私には奇妙に見えますが、ここで何が起こっているのか説明していただけますか?

上記のコードの出力は次のとおりです。

-8588633131198276118
634739049656490000
4

5 に答える 5

46

の値を保持する場合は、roundtripフォーマット指定子「O」または「o」を使用する必要がありDateTimeます。

「O」または「o」標準フォーマット指定子は、タイムゾーン情報を保持するパターンを使用して、カスタムの日付と時刻のフォーマット文字列を表します。DateTime値の場合、このフォーマット指定子は、日付と時刻の値をDateTime.Kindプロパティとともにテキストに保持するように設計されています。スタイルパラメータがDateTimeStyles.RoundtripKindに設定されている場合は、DateTime.Parse(String、IFormatProvider、DateTimeStyles)またはDateTime.ParseExactメソッドを使用して、フォーマットされた文字列を解析し直すことができます。

コードの使用(フォーマット文字列の変更は別として):

const string FMT = "O";
DateTime now1 = DateTime.Now;
string strDate = now1.ToString(FMT);
DateTime now2 = DateTime.ParseExact(strDate, FMT, CultureInfo.InvariantCulture);
Console.WriteLine(now1.ToBinary());
Console.WriteLine(now2.ToBinary());

私は得る:

-8588633127598789320
-8588633127598789320
于 2012-05-29T12:19:20.947 に答える
19

Odedの答えは良いですが、UTCの日付ではうまくいきませんでした。UTC日付で機能させるには、DateTimeStylesの値として「RoundtripKind」を指定して、現地時間であると想定しないようにする必要がありました。上記から更新されたコードは次のとおりです。

const string FMT = "O";
DateTime now1 = DateTime.Now;
string strDate = now1.ToString(FMT);
DateTime now2 = DateTime.ParseExact(strDate, FMT, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
Console.WriteLine(now1.ToBinary());
Console.WriteLine(now2.ToBinary());

これはUTCと現地の日付の両方で機能することに注意してください。

于 2016-12-31T18:27:52.077 に答える
2

2つのこと:

  1. を指定するために、DateTimeStyleパラメーターを受け取るParseExactオーバーロードを使用できますAssumeLocal

  2. 精度を3ではなく7桁に上げない限り、now1とnow2の間にはまだ小さな違いがあります。 "yyyy-MM-dd HH:mm:ss.fffffff"

        const string FMT = "yyyy-MM-dd HH:mm:ss.fffffff";
        DateTime now1 = DateTime.Now;
        string strDate = now1.ToString(FMT);
        DateTime now2 = DateTime.ParseExact(strDate, FMT, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);
        Console.WriteLine(now1.ToBinary());
        Console.WriteLine(now2.ToBinary());
    

上記の変更がなくても、バイナリ値が類似していないように見えても、now1とnow2の計算された差は小さいように見えます。

        TimeSpan difference = now2.Subtract(now1);
        Console.WriteLine(difference.ToString());
于 2012-05-29T12:37:22.690 に答える
2

文字列を人間が読める形式にする必要がない場合(たとえば、保存する前に文字列を暗号化したい場合)、電話をかけstring str = dt1.ToBinary().ToString();DateTime dt2 = DateTime.FromBinary(long.Parse(str));

DateTime now1 = DateTime.Now;
string strDate = now1.ToBinary().ToString();
DateTime now2 = DateTime.FromBinary(long.Parse(strDate));
Console.WriteLine(now1.ToBinary());
Console.WriteLine(now2.ToBinary());
于 2018-10-09T15:42:15.927 に答える
-2

このコードを使用するだけで、日時が文字列に変換され、文字列が日時に変換されます

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace DateTimeConvert
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
              label1.Text = ConvDate_as_str(textBox1.Text);
        }

        public string ConvDate_as_str(string dateFormat)
        {
            try
            {
                char[] ch = dateFormat.ToCharArray();
                string[] sps = dateFormat.Split(' ');
                string[] spd = sps[0].Split('.');
                dateFormat = spd[0] + ":" + spd[1] + " " + sps[1];
                DateTime dt = new DateTime();
                dt = Convert.ToDateTime(dateFormat);
                return dt.Hour.ToString("00") + dt.Minute.ToString("00");
            }
            catch (Exception ex)
            {
                return "Enter Correct Format like <5.12 pm>";
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            label2.Text = ConvDate_as_date(textBox2.Text);
        }

        public string ConvDate_as_date(string stringFormat)
        {
            try
            {
                string hour = stringFormat.Substring(0, 2);
                string min = stringFormat.Substring(2, 2);
                DateTime dt = new DateTime();
                dt = Convert.ToDateTime(hour+":"+min);
                return String.Format("{0:t}", dt); ;
            }
            catch (Exception ex)
            {
                return "Please Enter Correct format like <0559>";
            }
        }
    }
}
于 2012-11-05T06:48:55.353 に答える