2016-06-15 16 views
8

Come posso formattare un oggetto DateTime su una stringa nel formato data/ora predefinito del dispositivo quando si esegue un progetto PCL Xamarin.Form e le destinazioni di deployment includono iOS, Android e Windows.Formato DateTime in Xamarin Forms to Device Formato stringa

Il DateTime.ToShortString() non funziona secondo i requisiti MSDN secondo questo thread e questo bug.

Esiste una soluzione basata su moduli o è necessario ottenerla dai progetti specifici della piattaforma?

per Android, posso effettuare le seguenti operazioni dal progetto originario usando DI:

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

o posso usare questa (la versione C# del codice qui sotto) troppo:

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

Se vuoi in this QUINTA domanda per capire più chiaramente il requisito (è solo per Android, lo voglio per tutte le piattaforme in quanto si tratta di una domanda Xamarin.Forms).

Poiché lo DatePicker e TimePicker in Xamarin Form mostra la data e l'ora nel formato del dispositivo, spero che ci sia un modo per ottenerlo nel PCL.

Inoltre v'è una classe Device in PCL che ha informazioni come piattaforme, linguaggio, ecc

+0

Probabilmente si vorrà considerare l'utilizzo del servizio di dipendenza se la formattazione è specifica del client. https://developer.xamarin.com/guides/xamarin-forms/dependency-service/introduction/ –

+0

@AndresCastro - Grazie, ma sto cercando un'opzione da PCL, sì, so che potrebbe essere fatto tramite DI ottenerlo per ogni piattaforma. –

+2

Gotcha, penserei che usare semplicemente dateTime.ToString ("d") funzionerebbe come dovrebbe applicare ToString nella cultura corrente. Io sinceramente non l'ho provato prima però. Potrebbe essere interessante vedere cosa succede quando cambi la cultura del tuo dispositivo. –

risposta

2

Come io non riuscivo a trovare qualsiasi implementazione PCL ho usato DI per applicare la norma.

Uso in PCL:

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); 
       } 
      } 
     } 
    } 
} 

di Windows: metodo

[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(); 
     } 
    } 
} 

Helper:

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

Con la versione corrente Xamarin Forms, potete provare:

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

Questo dà la data in un formato specifico per localizzazione del dispositivo e funziona su diverse piattaforme.

alternativa:

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

Per il formato specifico quanto segue può essere provato:

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

Il primo e l'ultimo aspetto abbastanza freddo per me. Ma solo la seconda e la terza opzione funzionano con PCL.

Problemi correlati