没有 javascript 就无法获取用户时间。
如果使用 Blazor 服务器端,C# 代码将在服务器上运行。
但是你可以调用javascript函数。
见https://docs.microsoft.com/en-us/aspnet/core/blazor/call-javascript-from-dotnet?view=aspnetcore-3.1
这是获取用户日期和时间偏移量的 javascript(在 _Host.cshtml 的标头元素中添加脚本标记):
<script>
window.localDate = () => {
var ldCurrentDate = new Date();
return ldCurrentDate.getFullYear() +
"-" + String(ldCurrentDate.getMonth() + 1).padStart(2, '0') +
"-" + String(ldCurrentDate.getDate()).padStart(2, '0') +
"T" +
String(ldCurrentDate.getHours()).padStart(2, '0') +
":" + String(ldCurrentDate.getMinutes()).padStart(2, '0') +
":" + String(ldCurrentDate.getSeconds()).padStart(2, '0');
};
window.utcDate = () => {
var ldCurrentDate = new Date();
return ldCurrentDate.getUTCFullYear() +
"-" + String(ldCurrentDate.getUTCMonth() + 1).padStart(2, '0') +
"-" + String(ldCurrentDate.getUTCDate()).padStart(2, '0') +
"T" +
String(ldCurrentDate.getUTCHours()).padStart(2, '0') +
":" + String(ldCurrentDate.getUTCMinutes()).padStart(2, '0') +
":" + String(ldCurrentDate.getUTCSeconds()).padStart(2, '0');
};
window.timeZoneOffset = () => {
return new Date().getTimezoneOffset() / 60;
};
</script>
从 C# 调用:
@page "/dates"
@inject IJSRuntime JSRuntime;
<button type="button" @onclick="GetDates">
Get Dates
</button>
<p>
<span>
User Date: @string.Format("{0:G}", this.UserDate)
</span>
</p>
<p>
<span>
Utc Date: @string.Format("{0:G}", this.UTCDate)
</span>
</p>
<p>
<span>
TimeZoneOffset: @string.Format("{0}", this.TimeZoneOffset)
</span>
</p>
<p>
<span>
ServerDate: @string.Format("{0:G}", this.ServerDate)
</span>
</p>
@code {
private DateTime UserDate { get; set; }
private DateTime UTCDate { get; set; }
private DateTime ServerDate { get; set; }
private int TimeZoneOffset { get; set; }
private async Task GetDates()
{
this.ServerDate = DateTime.Now;
this.UserDate = await JSRuntime.InvokeAsync<DateTime>("localDate");
this.UTCDate = await JSRuntime.InvokeAsync<DateTime>("utcDate");
this.TimeZoneOffset = await JSRuntime.InvokeAsync<int>("timeZoneOffset");
}
}