gpt4 book ai didi

c# - 将 Xamarin Forms 中的 DateTime 格式化为设备格式字符串

转载 作者:可可西里 更新时间:2023-11-01 08:27:51 26 4
gpt4 key购买 nike

在运行 PCL Xamarin.Forms 项目并且我的部署目标包括 iOS、Android 和 Windows 时,如何将 DateTime 对象格式化为设备默认日期时间格式的字符串。

根据此 threadDateTime.ToShortString() 无法按照 MSDN 要求工作还有这个bug .

是否有任何基于表单的解决方案,或者我是否需要从特定于平台的项目中获取它?

对于 Android,我可以使用 DI 从 native 项目执行以下操作:

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

或者我也可以使用它(以下代码的 C# 版本):

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

查看this SO 问题以更清楚地理解需求(它仅适用于 android,我希望它适用于所有平台,因为这是一个 Xamarin.Forms 问题)。

由于 Xamarin Forms 中的 DatePickerTimePicker 以设备格式显示日期和时间,我希望有一种方法可以在 PCL 中获取它。

PCL 中还有一个Device类,里面有平台、惯用语等信息。

最佳答案

由于我找不到任何 PCL 实现,所以我使用 DI 来实现该要求。

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

安卓:

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

苹果:

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

window :

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

辅助方法:

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

关于c# - 将 Xamarin Forms 中的 DateTime 格式化为设备格式字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37835096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com