2016-06-15 52 views
8

Bir PCL Xamarin.Forms projesini çalıştırırken aygıt varsayılan datetime biçimindeki bir dize için DateTime nesnesini nasıl biçimlendirebilirim ve dağıtım hedeflerim iOS, Android ve Windows'u içerir.Biçimlendir DateTime, Xamarin Formları - Aygıt Formatı dize

DateTime.ToShortString(), bu thread ve bu bug uyarınca MSDN gereksinimlerine göre çalışmaz.

Herhangi bir Forms tabanlı çözüm var mı, yoksa platforma özel projelerden mi almam gerekiyor?

Android için, ben kullanarak Yerli projeden aşağıdaki DI yapabilirsiniz:

String format = Settings.System.GetString(this.context.ContentResolver 
             , Settings.System.DateFormat); 
string shortDateString = dateTime.ToString(format); 

VEYA bu da (aşağıda kodun C# sürümünü) kullanabilirsiniz:

DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(context); 

Bak içine this Soruyu daha açık bir şekilde anlamak için soru (onun sadece android için, bu bir Xamarin.Forms sorusu gibi tüm platformlar için istiyorum).

Xamarin Formlar'daki DatePicker ve TimePicker'dan itibaren cihaz biçimindeki tarih ve saat gösteriliyor, bu yüzden PCL'de almanın bir yolu olacağını umuyorum.

Ayrıca ben gereksinimi uygulamayı DI kullanılan herhangi PCL uygulanmasını bulamadık gibi vb

+0

Biçimlendirme istemciye özgüyse bağımlılık hizmetini kullanmak isteyebilirsiniz. https://developer.xamarin.com/guides/xamarin-forms/dependency-service/introduction/ –

+0

@AndresCastro - Teşekkürler ama PCL'den bir seçenek arıyorum, evet her birimiz için DI ile elde edilebileceğini biliyorum platformudur. –

+2

Gotcha, Ben sadece dateTime.ToString ("d") kullanarak geçerli kültürde ToString uygulamanız gerektiği gibi çalışacağını düşünürdüm. Dürüst olmak gerekirse daha önce test etmedim. Cihazınızın kültürünü değiştirdiğinizde ne olacağını görmek ilginç olabilir. –

cevap

2

platformları, deyim, gibi bilgiler bulunur PCL'de bir Device sınıfı bulunmaktadır. PCL'de

Kullanımı:

DependencyService.Get<IDeviceInfoService>()?.ConvertToDeviceTimeFormat(DateTime.Now);  
DependencyService.Get<IDeviceInfoService>()?.ConvertToDeviceTimeFormat(DateTime.Now); 

PCL:

public interface IDeviceInfoService 
{ 
    string ConvertToDeviceShortDateFormat(DateTime inputDateTime);  
    string ConvertToDeviceTimeFormat(DateTime inputDateTime); 
} 

Android:

[assembly: Dependency(typeof(DeviceInfoServiceImplementation))] 
namespace Droid.Services 
{ 
    public class DeviceInfoServiceImplementation : IDeviceInfoService 
    { 
     public string ConvertToDeviceShortDateFormat(DateTime inputDateTime) 
     { 
      var dateFormat = Android.Text.Format.DateFormat.GetDateFormat(Android.App.Application.Context); 
      var epochDateTime = Helper.ConvertDateTimeToUnixTime(inputDateTime, true); 

      if (epochDateTime == null) 
      { 
       return string.Empty; 
      } 

      using (var javaDate = new Java.Util.Date((long)epochDateTime)) 
      { 
       return dateFormat.Format(javaDate); 
      } 
     } 

     public string ConvertToDeviceTimeFormat(DateTime inputDateTime) 
     { 
      var timeFormat = Android.Text.Format.DateFormat.GetTimeFormat(Android.App.Application.Context); 
      var epochDateTime = Helper.ConvertDateTimeToUnixTime(inputDateTime, true); 

      if (epochDateTime == null) 
      { 
       return string.Empty; 
      } 

      using (var javaDate = new Java.Util.Date((long)epochDateTime)) 
      { 
       return timeFormat.Format(javaDate); 
      } 
     } 
    } 
} 

iOS:

[assembly: Dependency(typeof(DeviceInfoServiceImplementation))] 
namespace iOS.Services 
{ 
    public class DeviceInfoServiceImplementation : IDeviceInfoService 
    { 
     public string ConvertToDeviceShortDateFormat(DateTime inputDateTime) 
     { 
      var timeInEpoch = Helper.ConvertDateTimeToUnixTime(inputDateTime); 

      if (timeInEpoch == null) 
      { 
       return string.Empty; 
      } 

      using (var dateInNsDate = NSDate.FromTimeIntervalSince1970((double)timeInEpoch)) 
      { 
       using (var formatter = new NSDateFormatter 
       { 
        TimeStyle = NSDateFormatterStyle.None, 
        DateStyle = NSDateFormatterStyle.Short, 
        Locale = NSLocale.CurrentLocale 
       }) 
       { 
        return formatter.ToString(dateInNsDate); 
       } 
      } 
     } 

     public string ConvertToDeviceTimeFormat(DateTime inputDateTime) 
     { 
      var timeInEpoch = Helper.ConvertDateTimeToUnixTime(inputDateTime); 

      if (timeInEpoch == null) 
      { 
       return string.Empty; 
      } 

      using (var dateInNsDate = NSDate.FromTimeIntervalSince1970((double)timeInEpoch)) 
      { 
       using (var formatter = new NSDateFormatter 
       { 
        TimeStyle = NSDateFormatterStyle.Short, 
        DateStyle = NSDateFormatterStyle.None, 
        Locale = NSLocale.CurrentLocale 
       }) 
       { 
        return formatter.ToString(dateInNsDate); 
       } 
      } 
     } 
    } 
} 

Pencereler:

[assembly: Dependency(typeof(DeviceInfoServiceImplementation))] 
namespace WinPhone.Services 
{ 
    public class DeviceInfoServiceImplementation : IDeviceInfoService 
    { 
     public string ConvertToDeviceShortDateFormat(DateTime inputDateTime) 
     { 
      return inputDateTime.ToShortDateString(); 
     } 

     public string ConvertToDeviceTimeFormat(DateTime inputDateTime) 
     { 
      return inputDateTime.ToShortTimeString(); 
     } 
    } 
} 

Yardımcısı yöntemi: Geçerli Xamarin Forms sürümü ile

private static readonly DateTime EpochDateTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
public static long? ConvertDateTimeToUnixTime(DateTime? date, bool isDatarequiredInMilliSeconds = false, DateTimeKind dateTimeKind = DateTimeKind.Local) => date.HasValue == false 
      ? (long?)null 
      : Convert.ToInt64((DateTime.SpecifyKind(date.Value, dateTimeKind).ToUniversalTime() - EpochDateTime).TotalSeconds) * (isDatarequiredInMilliSeconds ? 1000 : 1); 
0

, denemek olabilir:

// This does not work with PCL 
var date1 = DateTime.Now.ToShortDateString(); 

Bu cihazın yerele özgü bir biçimde tarih verir ve platformlar arasında çalışır. Alternatif

:

var date1 = DateTime.Now.ToString(CultureInfo.CurrentUICulture.DateTimeFormat.ShortDatePattern); 

belirli biçimi için aşağıdaki denenebilir:

var date1 = DateTime.Now.ToString("dd-MM-yyyy"); 

ilk ve sonuncusu bana oldukça havalı görünüyor. Ancak sadece ikinci ve üçüncü seçenekler PCL ile çalışır.