【问题标题】:Blazor Server Side: How can I read out the local time of the user/browser not of the server (using only c#)Blazor 服务器端:如何读出用户/浏览器的本地时间而不是服务器的本地时间(仅使用 c#)
【发布时间】:2020-12-15 09:14:18
【问题描述】:

我创建了一个为用户显示天气数据的页面(我通过 api 调用获取数据)。我有来自 api 调用的数据的 UTC 时间戳。

我的问题是,如果我通过 ToLocalTime() 转换 UTC 时间,我的服务器的本地时间将显示为用户浏览器的本地时间。

有没有办法向用户显示“他们的”时间:UTCTime.ToUserTimeZone() 仅使用 C# 和 Blazor?

我对 JS 等的了解为零,或者这是唯一的方法。我用谷歌搜索并找到了很多答案,我必须实现 JavaScript 才能“获取”用户本地化。

感谢您的帮助和时间

【问题讨论】:

  • 既然您想要通过浏览器检查用户的本地时间,那么您真的需要使用 javascript 在客户端实现它,因为 c# 用于服务器端代码。一篇可以为您提供更多详细信息的文章,Are server-side and client-side programming the same?
  • @PinBack 非常感谢您展示...我工作得很好(乍一看;))而且我对 JS 的了解更多,因为您的帖子告诉我如何调用 JS从布雷泽。我已经避免了太久了

标签: c# server localization utc blazor-server-side


【解决方案1】:

没有 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");
    }
}

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,并创建了一个名为 Blazor Time 的库来解决它。

    要安装 BlazorTime,请运行 Install-Package BlazorTime

    然后将&lt;script src="_content/BlazorTime/blazorTime.js"&gt;&lt;/script&gt; 添加到您的主机或索引文件中

    之后,您可以使用&lt;ToLocal&gt; 标签在用户本地时间显示值

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

    【讨论】:

    • 这个答案将解决将服务器/UTC时间转换为本地时间的部分,但无法在blazor代码中获取本地时间
    • 这是正确的,所以如果你想知道还有多少时间到午夜,那么这对你来说不是正确的图书馆。您可能需要考虑使用@inject IJSRuntime JSRuntime 获取用户当前时间,然后以这种方式执行计算
    【解决方案3】:

    您可以更简单地读取 本地和 UTC 时间并从 JS 接收 .NET DateTime 类型

    • 当地时间:new Date().toISOString();
    • UTC时间:new Date().toUTCString();

    另请注意,.NET 5 JS Interop 发生了很大变化。请查看新的 IJSRuntime InterfaceJS Isolation 文档。

    通过使用 .NET 5 JS 隔离(调用 JS 函数非常相似,但略有不同,请参阅上面的文档):

    export function localDate() {
      return new Date().toISOString();
    }
    export function utcDate() {
      return new Date().toUTCString();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-11
      • 2017-09-14
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      相关资源
      最近更新 更多