2014-11-03 25 views
10

Kodumda birçok DateTime kullanıyorum. Bu DateTimes'ı belirli bir tarihime değiştirmek ve zamanını tutmak istiyorum.Zaman bölümünü korurken, bir DateTime'ın yalnızca tarih bölümünü nasıl değiştirebilirim?

1. "2012/02/02 06:00:00" => "2015/12/12 : 06:00:00" 
2. "2013/02/02 12:00:00" => "2015/12/12 : 12:00:00" 

Ben değiştirmek için bu stili kullanan, ama iyi bir yol değil gibi görünüyor ve ben bu görevi başarmak için herhangi bir yol var sormak istiyorum.

DateTime newDateTime = new DateTime(2015,12,12,oldDateTime.Hour,oldDateTime.Minute,0); 
+0

Ne formülü yeni yılı, ayı ve günü hesaplamak için kullanıyoruz, yoksa sadece orijinal zaman bölümü ile aynı tarih parçası olması tüm tarihleri ​​değiştirmeye çalışıyorsun? –

+0

Ayrıca, "iyi yol değil" ile ne demek istiyorsun? Mevcut uygulama ile ilgili sorun nedir? Kodunuz yeni datetime nesnesi oluştururken nasıl gösterir iken –

+1

, bu sorunuzun bağlamını göstermez. Örneğin, bunları belirli bir formatta konsola veya ekrana yazdırmaya mı çalışıyorsunuz? Değerin ilk bölümünü nereden alıyorsunuz? Biraz daha fazla bilgi içeren bir sürü insan doğru –

cevap

11

Verdiğiniz bilgilerle, bu yöntemin iyi olduğunu düşünüyorum. Sık sık oldDateTime.Hour,oldDateTime.Minute,0 parça yeniden yazmamak için isterseniz, yöntem çağrıları basitleştirmek için kendi statik sınıf oluşturabilir. Normal uygulamada

:

class Program 
{ 
    static void Main(string[] args) 
    { 
     DateTime time = DateTime.Now; 
     DateTime newDateTime = MyDateTimeUtil.CreateDateFromTime(2015, 12, 12, time); 
    } 
} 

DateTime değer yaratan statik sınıfı: saniye, milisaniye ve olacağını zaman küçük parçalar korur

public static class MyDateTimeUtil 
{ 
    public static DateTime CreateDateFromTime(int year, int month, int day, DateTime time) 
    { 
     return new DateTime(year, month, day, time.Hour, time.Minute, 0); 
    } 
} 
+0

grovesNL ederiz size rehberlik edebilecek eminim! Yardımcı sınıfınızla iyi bir fikir. Yani bu örnekle, C# 'da bu hakkı yapacak herhangi bir yönteme sahip olmadığı anlamına mı geliyor? – borrom

+0

@borrom: Evet, bu yüzden 'System.DateTime' sınıf varsayılan olarak yöntemin bu tür dahil etmek istemem, oldukça özelleşmiş bir taleptir. Tüm olası 'DateTime 'yapıcıları [MSDN girdisinde] listelenir (http://msdn.microsoft.com/en-us/library/system.datetime (v = vs.110) .aspx). – grovesNL

12

Daha iyi bir yol:

DateTime newDateTime = new DateTime(2015,12,12) + oldDateTime.TimeOfDay; 

Yoksa bir uzantısı yöntemi yapabiliriz Aynı zamanda, mevcut bir DateTime için yeni bir tarihi uygulamak ve bunun üzerine bir timeofday sensiz olmak yeni bir tarih güvenmiyorum: -

public static DateTime WithDate (this DateTime datetime, DateTime newDate) 
{ 
    return newDate.Date + datetime.TimeOfDay; 
} 

IMHO DateTime .NET en zayıf parçalarından biridir. Örneğin, bir TimeSpan bir TimeOfDay aynı değildir ve (ay cinsinden) bir 'TimePeriod' temsil edebilir - bu üç ayrı kavramlardır ve onları karıştırma kötü bir seçim oldu. DateTimeOffset'a geçmek genellikle tercih edilir veya mükemmel Noda zaman kütüphanesidir.

+0

@Lan Mercer. İş bulmak! Kodunu denedikten sonra. Teşekkürler – borrom

+0

Bazı hızlı testler yaptım ve bu yöntemin, DateTime (int yıl, int month, int gün, int saat, int dakika, int saniye, int milisaniye) 'kullanarak aldığı sürenin 1/6'sını aldığını buldum. . Ayrıca, newDate.Date.AddTicks (datetime.TimeOfDay.Ticks) 'i kullanmaktan yaklaşık% 6 daha hızlıdır. Yani temelde bunu kullan. :) – Andrew

İlgili konular