วันที่เทียบกับ DateTime


110

ฉันกำลังทำงานในโปรแกรมที่ต้องใช้วันที่ของกิจกรรมเพื่อรับคืน

ฉันกำลังมองหา a Dateไม่ใช่DateTime.

มีประเภทข้อมูลที่ส่งคืนวันที่หรือไม่

คำตอบ:


131

ไม่มีไม่มี DateTimeหมายถึงช่วงเวลาบางส่วนที่ประกอบด้วยวันที่และเวลา อย่างไรก็ตามคุณสามารถดึงข้อมูลส่วนวันที่ผ่านDateคุณสมบัติ (ซึ่งเป็นอีกส่วนหนึ่งDateTimeที่ตั้งเวลาไว้เป็น00:00:00)

และคุณสามารถดึงคุณสมบัติวันส่วนบุคคลผ่านทางDay, และMonthYear


23

ฉันสร้างโครงสร้างวันที่อย่างง่ายสำหรับเวลาที่คุณต้องการวันที่ง่ายๆโดยไม่ต้องกังวลเกี่ยวกับส่วนของเวลาเขตเวลาท้องถิ่นกับ utc ฯลฯ

Date today = Date.Today;
Date yesterday = Date.Today.AddDays(-1);
Date independenceDay = Date.Parse("2013-07-04");

independenceDay.ToLongString();    // "Thursday, July 4, 2013"
independenceDay.ToShortString();   // "7/4/2013"
independenceDay.ToString();        // "7/4/2013"
independenceDay.ToString("s");     // "2013-07-04"
int july = independenceDay.Month;  // 7

https://github.com/claycephus/csharp-date


2
ขอบคุณ! ที่มีประโยชน์.
garfbradaz

16

น่าเสียดายที่ไม่ได้อยู่ใน. Net BCL โดยปกติวันที่จะแสดงเป็นวัตถุ DateTime โดยตั้งเวลาไว้ที่เที่ยงคืน

อย่างที่คุณคาดเดาได้นั่นหมายความว่าคุณมีปัญหาเกี่ยวกับเขตเวลาของผู้ดูแลทั้งหมดแม้ว่าสำหรับวัตถุ Date คุณจะไม่ต้องการให้มีการจัดการเขตเวลาเลยก็ตาม


1
หากคุณใช้ค่า DateTime เป็นวันที่ให้ตั้งค่า Kind เป็น UTC ไม่มีการปรับโซนเวลาให้จัดการ DateTime วันที่ = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc);
Suncat2000

ใช่ฉันสามารถพูดจากประสบการณ์ที่ใช้dateสำหรับสิ่งที่เป็นความคิดที่ไม่ดีถ้าคุณแน่ใจ 100% ของแอปเท่านั้นที่เคยจะดำเนินการในเขตเวลาหนึ่ง การบันทึกทุกอย่างเพื่อdatetimeให้คุณได้สิ่งที่ดีที่สุดของทั้งสองโลกรวมถึงวิธีที่ง่ายที่สุดในการหลีกเลี่ยงฝันร้ายในเขตเวลาหากการกำหนดเขตเวลาของเซิร์ฟเวอร์ของคุณเปลี่ยนแปลงไป ... และเริ่มเขียนข้อมูลในแบบที่คุณไม่คาดคิด Datetimeสามารถช่วยคุณไว้ที่นั่นdateไม่ได้เลยและจะกลายเป็นเรื่องยากที่จะแก้ไขหากคุณเริ่มdateจดบันทึกด้วยบริบทเขตเวลาที่ไม่ถูกต้อง
Kelsey Hannan

2
@KelseyHannan เว้นแต่คุณจะจัดการกับสิ่งต่างๆเช่น "วันเดือนปีเกิด" หรือ "วันที่ซื้อ" โดยที่คุณไม่ต้องการสิ่งที่เปลี่ยนแปลงไปอย่างลึกลับเพียงเพราะคุณย้ายประเทศ เช่นเดียวกับที่กล่าวว่าการประมวลผลแอปพลิเคชันจำนองของชาวไอริชในนิวซีแลนด์เป็นตัวอย่างที่ไม่สุ่ม
Roger Willcocks

9

สร้างคลาส Wrapper สิ่งนี้:

public class Date:IEquatable<Date>,IEquatable<DateTime>
    {
        public Date(DateTime date)
        {
            value = date.Date;
        }

        public bool Equals(Date other)
        {
            return other != null && value.Equals(other.value);
        }

        public bool Equals(DateTime other)
        {
            return value.Equals(other);
        }

        public override string ToString()
        {
            return value.ToString();
        }
        public static implicit operator DateTime(Date date)
        {
            return date.value;
        }
        public static explicit operator Date(DateTime dateTime)
        {
            return new Date(dateTime);
        }

        private DateTime value;
    }

และเปิดเผยสิ่งที่valueคุณต้องการ


4
ผมขอแนะนำว่าคอนสตรัคของคุณควรตั้งDateTime.KindไปDateTimeKind.Unspecifiedเพื่อที่ว่าเมื่อต่อเนื่องจะได้รับการ deserialized โดยไม่ต้องแปลง (อาจมีการเปลี่ยนแปลงขึ้นอยู่กับวันที่แตกต่างกันในเขตเวลา)
oatsoda

1
@OffHeGoes ตั้งค่า DateTime.Kind เป็นDateTimeKind.Utc. อย่าตั้งค่าเป็นDateTimeKind.Unspecifiedเพราะจะรับประกันว่าจะได้รับอนุกรม / deserialized ด้วยการชดเชยเขตเวลาที่รวม! วันที่ในปฏิทินจะเหมือนกันโดยไม่คำนึงถึงเขตเวลาดังนั้นอย่าปล่อยให้ระบบปรับเปลี่ยน
Suncat2000

5

ประเภทวันที่เป็นเพียงนามแฝงของประเภท DateTime ที่ VB.NET ใช้ (เช่น int กลายเป็นจำนวนเต็ม) ทั้งสองประเภทนี้มีคุณสมบัติ Date ที่ส่งคืนออบเจ็กต์ให้คุณโดยกำหนดส่วนเวลาเป็น 00:00:00


1
จริง. หน้าเอกสาร MSDN สำหรับชนิดวันที่ VB.NETระบุว่า: ประเภทที่เกี่ยวข้องใน. NET Framework คือโครงสร้างSystem.DateTime
miroxlav

4

DateTime มีคุณสมบัติDateที่คุณสามารถใช้เพื่อแยกส่วนวันที่ ToStringวิธีการยังไม่ได้งานที่ดีของการแสดงเพียงส่วนหนึ่งวันเมื่อเวลาส่วนหนึ่งที่ยังว่างอยู่


3

วัตถุ DateTime มีคุณสมบัติที่ส่งคืนเฉพาะส่วนวันที่ของค่า

    public static void Main()
{
    System.DateTime _Now = DateAndTime.Now;
    Console.WriteLine("The Date and Time is " + _Now);
    //will return the date and time
    Console.WriteLine("The Date Only is " + _Now.Date);
    //will return only the date
    Console.Write("Press any key to continue . . . ");
    Console.ReadKey(true);
}

คำตอบนี้ไม่ถูกต้อง วันที่ส่งกลับ a DateTimeโดยตั้งเวลาเป็น 0:00:00
Serj Sagan

3

ไม่มีDateDataType

อย่างไรก็ตามคุณสามารถใช้DateTime.Dateเพื่อรับเพียงวันที่

เช่น

DateTime date = DateTime.Now.Date;

มีโครงสร้างวันที่และอาจประกาศวัตถุเป็นประเภทวันที่
Kaleb Anderson

@KalebAnderson ไม่ได้อยู่ในการใช้งาน. NET เริ่มต้นไม่มี หากคุณกำลังพูดถึง VB.net Date นั่นยังคงเป็น DateTime
Nick N.

DateTime.Now.DateเหมือนกับDateTime.Today. มีการDateTime.UtcNowส่งคืนค่าวันที่ - เวลาเป็นเวลาสากล (UTC) แต่ไม่มีวิธีการหรือคุณสมบัติที่เทียบเท่า UTC สำหรับวันนี้ DateTimeKind.UtcNow.Dateเป็นนิพจน์ที่เหมาะสม
Suncat2000

2

คุณสามารถส่งคืน DateTime โดยที่ส่วนของเวลาคือ 00:00:00 น. และไม่ต้องสนใจมัน วันที่จะได้รับการจัดการเป็นจำนวนเต็มเวลาดังนั้นจึงควรรวมวันที่กับเวลาตามที่มีอยู่ในจำนวนเต็มอยู่ดี


2

สำหรับสิ่งนี้คุณต้องใช้วันที่ แต่ไม่ต้องสนใจค่าเวลา

โดยปกติวันที่จะเป็น DateTime พร้อมเวลาของ 00:00:00

DateTimeชนิดมี.Dateคุณสมบัติที่จะส่งกลับDateTimeด้วยเวลาชุดมูลค่าดังกล่าวข้างต้น



0

คุณสามารถลองทำอย่างใดอย่างหนึ่งต่อไปนี้:

DateTime.Now.ToLongDateString();
DateTime.Now.ToShortDateString();

แต่ไม่มีประเภท "วันที่" ใน BCL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.