Angular 5 和 .NET Core 2.1 API:获取用户时区的当前时间
Angular 5 and .NET Core 2.1 API: Getting current time in user's timezone
这可行,但我想知道是否有人有更好的方法。
目标:
获取客户端的日期时间偏移量和 return 客户端本地时间的日期时间值。
我做了什么:
在 front-end 上,我创建了一个自定义 header 并在请求中传递了它。
export class ItemService {
baseUrl = environment.apiUrl;
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'TimeZone-Offset': `${new Date().getTimezoneOffset()}`
})
}
constructur(private authHttp: HttpClient) { }
getItems() {
return this.authHttp.get<Item[]>(this.baseUrl + 'items',
{ headers: this.httpOptions.headers });
}
}
然后在 back-end 上,我提取了 header 值,将其转换为整数,然后使用 AddMinutes
功能将 UTC 时间转换为本地时间。
public class ItemsController : Controller
{
[HttpGet]
public async Task<IActionResult> GetItems()
{
var currentTime = DateTime.UtcNow.AddMinutes(int.Parse(
Request.Headers["TimeZone-Offset"] != StringValues.Empty
? Request.Headers["TimeZone-Offset"][0] : "0"));
// ...logic to return items
}
因此,如果添加TimeZone-Offset header,服务器将能够将DateTimes 转换为客户端的本地时间,否则,DateTimes 将以UTC 格式给出。有没有更好的办法?我是否应该将所有 UTC 保留在服务器上,然后在 client-side 上进行 UTC 到本地的转换?
您可以通过 NuGet 安装TimeZoneConverter。
然后,如果您设法在您的 header 中传递时区信息,例如 Europe/Berlin
,您可以在后端执行以下操作:
using TimeZoneConverter;
...
string timezoneString = "Europe/Berlin";
TimeZoneInfo timezone = TZConvert.GetTimeZoneInfo(timezoneString);
Console.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, timezone));
确保将每个时间戳作为 UTC 发送给客户端。类似于“2018-12-12T20:13:00.000Z”。如果将其转换为 JavaScript 日期,它应该会自动显示在浏览器的本地时区中。
这可行,但我想知道是否有人有更好的方法。
目标:
获取客户端的日期时间偏移量和 return 客户端本地时间的日期时间值。
我做了什么:
在 front-end 上,我创建了一个自定义 header 并在请求中传递了它。
export class ItemService {
baseUrl = environment.apiUrl;
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'TimeZone-Offset': `${new Date().getTimezoneOffset()}`
})
}
constructur(private authHttp: HttpClient) { }
getItems() {
return this.authHttp.get<Item[]>(this.baseUrl + 'items',
{ headers: this.httpOptions.headers });
}
}
然后在 back-end 上,我提取了 header 值,将其转换为整数,然后使用 AddMinutes
功能将 UTC 时间转换为本地时间。
public class ItemsController : Controller
{
[HttpGet]
public async Task<IActionResult> GetItems()
{
var currentTime = DateTime.UtcNow.AddMinutes(int.Parse(
Request.Headers["TimeZone-Offset"] != StringValues.Empty
? Request.Headers["TimeZone-Offset"][0] : "0"));
// ...logic to return items
}
因此,如果添加TimeZone-Offset header,服务器将能够将DateTimes 转换为客户端的本地时间,否则,DateTimes 将以UTC 格式给出。有没有更好的办法?我是否应该将所有 UTC 保留在服务器上,然后在 client-side 上进行 UTC 到本地的转换?
您可以通过 NuGet 安装TimeZoneConverter。
然后,如果您设法在您的 header 中传递时区信息,例如 Europe/Berlin
,您可以在后端执行以下操作:
using TimeZoneConverter;
...
string timezoneString = "Europe/Berlin";
TimeZoneInfo timezone = TZConvert.GetTimeZoneInfo(timezoneString);
Console.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, timezone));
确保将每个时间戳作为 UTC 发送给客户端。类似于“2018-12-12T20:13:00.000Z”。如果将其转换为 JavaScript 日期,它应该会自动显示在浏览器的本地时区中。