Blazor 服务器端:如何读出 user/browser 而不是服务器的本地时间(仅使用 c#)
Blazor Server Side: How can I read out the local time of the user/browser not of the server (using only c#)
我创建了一个页面,为用户显示天气数据(我通过 api 调用获取数据)。我有来自 api 调用的数据的 UTC 时间戳。
我的问题是,如果我通过 ToLocalTime() 转换 UTC 时间,则显示的是我服务器的本地时间,而不是用户浏览器的本地时间。
有没有办法向用户显示“他们的”时间:UTCTime.ToUserTimeZone() 仅使用 C# 和 Blazor?
我对 JS 等零知识,或者这是唯一的方法。我用谷歌搜索并找到了很多答案,我必须在其中实施 JavaScript 以“获取”用户本地化。
感谢您的帮助和时间
没有javascript就无法获取用户时间。
如果您使用 Blazor 服务器端,则 C# 代码在服务器上运行。
但是你可以调用 javascript 函数。
参见 https://docs.microsoft.com/en-us/aspnet/core/blazor/call-javascript-from-dotnet?view=aspnetcore-3.1
这是获取用户日期和时间偏移的 javascript(在 _Host.cshtml 的 header 元素内添加脚本标签):
<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");
}
}
你可以读出 本地和 UTC 时间并从 JS 接收 .NET DateTime 类型 更简单:
- 当地时间:
new Date().toISOString();
- UTC 时间:
new Date().toUTCString();
另请注意 .NET 5 JS 互操作性发生了很大变化。请同时查看新的 IJSRuntime Interface and also JS Isolation 文档。
通过使用 .NET 5 JS 隔离(调用 JS 函数非常相似但略有变化,请参阅上面的文档):
export function localDate() {
return new Date().toISOString();
}
export function utcDate() {
return new Date().toUTCString();
}
我 运行 遇到了类似的问题并创建了一个名为 Blazor Time 的库来解决它。
安装 BlazorTime 运行 Install-Package BlazorTime
然后将 <script src="_content/BlazorTime/blazorTime.js"></script>
添加到您的主机或索引文件
之后,您可以使用 <ToLocal>
标签
以用户当地时间显示值
<p>
@*UTC to browser time*@
<ToLocal DateTime="testUtcTime" Format="ddd mmm dd yyyy HH:MM:ss"></ToLocal>
</p>
<p>
@*server time to browser time*@
<ToLocal DateTime="testServerTime" Format="default"></ToLocal>
</p>
<p>
@*display as iso example 2021-05-10*@
<ToLocal DateTime="testUtcTime" Format="yyyy-mm-dd"></ToLocal>
</p>
<p>
@*display as time example 2pm*@
<ToLocal DateTime="testUtcTime" Format="htt"></ToLocal>
</p>
<button @onclick="Update">Update Time</button>
@code {
private DateTime testUtcTime = DateTime.UtcNow;
private DateTime testServerTime = DateTime.Now;
private void Update()
{
testUtcTime = DateTime.UtcNow;
testServerTime = DateTime.Now;
}
}
我创建了一个页面,为用户显示天气数据(我通过 api 调用获取数据)。我有来自 api 调用的数据的 UTC 时间戳。
我的问题是,如果我通过 ToLocalTime() 转换 UTC 时间,则显示的是我服务器的本地时间,而不是用户浏览器的本地时间。
有没有办法向用户显示“他们的”时间:UTCTime.ToUserTimeZone() 仅使用 C# 和 Blazor?
我对 JS 等零知识,或者这是唯一的方法。我用谷歌搜索并找到了很多答案,我必须在其中实施 JavaScript 以“获取”用户本地化。
感谢您的帮助和时间
没有javascript就无法获取用户时间。
如果您使用 Blazor 服务器端,则 C# 代码在服务器上运行。
但是你可以调用 javascript 函数。
参见 https://docs.microsoft.com/en-us/aspnet/core/blazor/call-javascript-from-dotnet?view=aspnetcore-3.1
这是获取用户日期和时间偏移的 javascript(在 _Host.cshtml 的 header 元素内添加脚本标签):
<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");
}
}
你可以读出 本地和 UTC 时间并从 JS 接收 .NET DateTime 类型 更简单:
- 当地时间:
new Date().toISOString();
- UTC 时间:
new Date().toUTCString();
另请注意 .NET 5 JS 互操作性发生了很大变化。请同时查看新的 IJSRuntime Interface and also JS Isolation 文档。
通过使用 .NET 5 JS 隔离(调用 JS 函数非常相似但略有变化,请参阅上面的文档):
export function localDate() {
return new Date().toISOString();
}
export function utcDate() {
return new Date().toUTCString();
}
我 运行 遇到了类似的问题并创建了一个名为 Blazor Time 的库来解决它。
安装 BlazorTime 运行 Install-Package BlazorTime
然后将 <script src="_content/BlazorTime/blazorTime.js"></script>
添加到您的主机或索引文件
之后,您可以使用 <ToLocal>
标签
<p>
@*UTC to browser time*@
<ToLocal DateTime="testUtcTime" Format="ddd mmm dd yyyy HH:MM:ss"></ToLocal>
</p>
<p>
@*server time to browser time*@
<ToLocal DateTime="testServerTime" Format="default"></ToLocal>
</p>
<p>
@*display as iso example 2021-05-10*@
<ToLocal DateTime="testUtcTime" Format="yyyy-mm-dd"></ToLocal>
</p>
<p>
@*display as time example 2pm*@
<ToLocal DateTime="testUtcTime" Format="htt"></ToLocal>
</p>
<button @onclick="Update">Update Time</button>
@code {
private DateTime testUtcTime = DateTime.UtcNow;
private DateTime testServerTime = DateTime.Now;
private void Update()
{
testUtcTime = DateTime.UtcNow;
testServerTime = DateTime.Now;
}
}