18

重複の可能性:
UNIX タイムスタンプを DateTime に、またはその逆に変換する方法は?

私は次のクラスを持っています:

[DataContractAttribute]
public class TestClass
{
  [DataMemberAttribute]
  public DateTime MyDateTime { get; set; }
}

JSONは次のとおりです。

{ "MyDateTime":"1221818565" }

JSON は PHP Web サービスから返されています。

私がする必要があるのは、そのエポック文字列を有効な C# DateTime に変換することです。これを行う最善の方法は何ですか?

私がすることができます:

[IgnoreDataMemberAttribute]
public DateTime MyDateTime { get; set; }

[DataMemberAttribute(Name = "MyDateTime")]
public Int32 MyDateTimeTicks
{
  get { return this.MyDateTime.Convert(...); }
  set { this.Created = new DateTime(...); }
}

しかし、これに関する問題は、MyDateTimeTicks がパブリックであることです (プライベートに変更すると、シリアル化プロセスで例外が発生します)。

4

5 に答える 5

20

あなたが投稿したものを完成させ、それを非公開にすることは、私にとってはうまくいくようでした.

[DataContract]
public class TestClass
{

    private static readonly DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

    [IgnoreDataMember]
    public DateTime MyDateTime { get; set; }

    [DataMember(Name = "MyDateTime")]
    private int MyDateTimeTicks
    {
        get { return (int)(this.MyDateTime - unixEpoch).TotalSeconds; }
        set { this.MyDateTime = unixEpoch.AddSeconds(Convert.ToInt32(value)); }
    }

}
于 2008-10-31T00:58:51.873 に答える
7
private DateTime ConvertJsonStringToDateTime(string jsonTime)
        {
            if (!string.IsNullOrEmpty(jsonTime) && jsonTime.IndexOf("Date") > -1)
            {
                string milis = jsonTime.Substring(jsonTime.IndexOf("(") + 1);
                string sign = milis.IndexOf("+") > -1 ? "+" : "-";
                string hours = milis.Substring(milis.IndexOf(sign));
                milis = milis.Substring(0, milis.IndexOf(sign));
                hours = hours.Substring(0, hours.IndexOf(")"));
                return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(Convert.ToInt64(milis)).AddHours(Convert.ToInt64(hours) / 100);                 
            }

            return DateTime.Now;
        }
于 2012-08-09T16:29:54.193 に答える
4

これが私が思いついたものです。C# では、新しい DateTime を作成し、エポック値を「秒」としてこの DateTime に追加する必要があるようです。コードでは次のようになります。

new System.DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(1221818565);

Visual Studio のイミディエイト ウィンドウを使用すると、この操作の結果がデバッガー コンソールに出力されます。

{9/19/2008 10:02:45 AM}
    Date: {9/19/2008 12:00:00 AM}
    Day: 19
    DayOfWeek: Friday
    DayOfYear: 263
    Hour: 10
    Kind: Unspecified
    Millisecond: 0
    Minute: 2
    Month: 9
    Second: 45
    Ticks: 633574153650000000
    TimeOfDay: {10:02:45}
    Year: 2008
于 2008-10-30T21:13:19.830 に答える
1

必要なのは次のとおりです。

DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
DateTime dotnetTime = unixEpoch.AddSeconds(Convert.ToDouble(ticks));

ここticksで、はPHPから渡される値です。

于 2008-10-30T21:27:43.033 に答える