关于时间和时区问题,后面的参考文章中有详细的描述。

我遇到的问题是:

在MVC视图页面中,显示记录的生成时间 CreationTime

<div>
@Model.CreationTime
</div>

我使用的是 UTC 时间,页面显示的结果也确实是正确的UTC时间,然而,但是,这不是我们所期望的本地时间。

万水千山之后,找到了 ABP 提供的帮助类 Abp.Timing.Timezone.TimezoneHelper。

直接贴时区转换代码:

@using Abp.Timing.Timezone;
<div>
@TimezoneHelper.ConvertFromUtc(Model.CreationTime, TimeZoneInfo.Local.Id)
</div>

TimeZoneInfo.Local.Id  返回表示本地时区的 TimeZoneInfo 对象的Id。System.TimeZoneInfo 类是 .net 类,和 abp 无关。

TimezoneHelper.ConvertFromUtc 方法将UTC时间转为指定时区Id的当地时间。

到这里,你或许发现,好傻,把简单问题搞复杂了。一点不错,还不就是个时区转换问题吗,关 ABP P 事。难怪ABP的文档都不提怎么在页面中直接显示本地时间。

好吧,其实,看 ABP 的源码,TimezoneHelper.ConvertFromUtc 方法就一句代码:

public static DateTime? ConvertFromUtc(DateTime? date, string toTimeZoneId)
{
return Convert(date, "UTC", toTimeZoneId);
}

简单一点,我的代码就该是

<div>
@Convert(Model.CreationTime, "UTC", TimeZoneInfo.Local.Id)
</div>

简单是简单了,却多了一个 "UTC",而且,而且,无关ABP了 ......

另外,在 JS 脚本中,可使用 moment.js 实现,如显示 ABP 使用的实例代码

moment(data.record.creationTime).format('YYYY-MM-DD HH:mm:ss')

再好好学习之后,我们发现,ABP是支持多时区的。查看 Abp\Timing\Timezone\TimeZoneConverter.cs 源码文件,发现它提供了几个时间转换函数.

下面列出它实现的接口的定义:

namespace Abp.Timing.Timezone
{
//
// 摘要:
// Interface for timezone converter
public interface ITimeZoneConverter
{
//
// 摘要:
// Converts given date to application's time zone. If timezone setting is not specified,
// returns given date.
//
// 参数:
// date:
// Base date to convert
DateTime? Convert(DateTime? date);
//
// 摘要:
// Converts given date to tenant's time zone. If timezone setting is not specified,
// returns given date.
//
// 参数:
// date:
// Base date to convert
//
// tenantId:
// TenantId to convert date for
DateTime? Convert(DateTime? date, int tenantId);
//
// 摘要:
// Converts given date to user's time zone. If timezone setting is not specified,
// returns given date.
//
// 参数:
// date:
// Base date to convert
//
// tenantId:
// TenantId of user
//
// userId:
// UserId to convert date for
DateTime? Convert(DateTime? date, int? tenantId, long userId);
}
}

特此补充,以免误导。后面有时间再补充......

参考:

ABP Timing

ABP理论之时间

万水千山ABP - 时区问题的更多相关文章

  1. 万水千山ABP - 弹出对话框禁用回车

    模态对话框中禁用回车 ABP Zero 中,使用弹出对话框进行实体编辑,回车时会自动保存并关闭对话框.那么如何禁用这个回车功能 ? 查看实体列表视图 index.cshtml 所对应加载的脚本文件 i ...

  2. 万水千山ABP - 单租户时,成功保存数据后,数据不显示

    问题描述: ABP 禁用了多租户,在编辑一个实体记录后,能成功地保存数据,但数据列表中看不到这条记录.打开数据表查看,发现该实体记录的 TenantId 字段值成了 Null , 而不是预期的默认租户 ...

  3. 万水千山ABP - 系统发布后迁移 CodeFirst 数据库[原创]

    在项目开发的过程中,常会遇到项目发布后还变更数据库的情况.这时如何方便地进行数据库迁移呢 ? 下面直接列出操作的步骤: 1. 发布修改后的应用: 将最新版本的应用更新到目标机器中.更新的文件当然不包括 ...

  4. ABP理论之时间

    返回总目录 本篇目录 介绍 Clock 时区 绑定器和转换器 介绍 虽然有些应用针对的是一个特定的时区,但是也有一些应用针对多个不同的时区.为了满足这些需求,ABP为datetime操作提供了通用的基 ...

  5. ABP框架 - 时间

    文档目录 本节内容: 简介 时钟 客户端 时区 客户端 绑定器与转换器 简介 虽然有些应用目标市场只是在一个时区,有些应用目标市场是许多不同时区,为满足这种需求并集中化日期操作,ABP为日期操作提供公 ...

  6. ABP理论学习之发布说明

    返回总目录 查看更详细信息以及下载源代码请查看原文档 ABP v0.9.2.0 | [更新日期:2016/6/6 11:21:28 ] 解决方案转换成xproj/project.json格式. 添加了 ...

  7. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十七节--Quartz与ABP框架Abp.Quartz及扩展

    ABP+AdminLTE+Bootstrap Table权限管理系统一期 Github:https://github.com/Jimmey-Jiang/ABP-ASP.NET-Boilerplate- ...

  8. ABP官方文档翻译 2.6 定时

    定时 介绍 时钟 客户端 时区 客户端 Binders和Converters 介绍 一些应用只针对一个时区,而其他的一些已用则有许多不同的时区.为了满足这样的需求和集中的时间操作,Abp提供了时间操作 ...

  9. [Abp 源码分析]十三、多语言(本地化)处理

    0.简介 如果你所开发的需要走向世界的话,那么肯定需要针对每一个用户进行不同的本地化处理,有可能你的客户在日本,需要使用日语作为显示文本,也有可能你的客户在美国,需要使用英语作为显示文本.如果你还是一 ...

随机推荐

  1. Windows下多线程数据同步互斥的有关知识

     对于操作系统而言,在并行程序设计中难免会遇到数据同步和共享的问题,本文针对这个问题,以windows系统为例回顾一下资源同步的相关问题.要点如下: 1.同步和数据共享  数据征用 2.同步原语 ...

  2. ECMAScript 6之Set和Map数据结构

    Set 基本用法 ES6提供了新的数据结构Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set本身是一个构造函数,用来生成Set数据结构. var s = new Set(); [2, ...

  3. Latex 表格内文字过长自动换行

    法一: [plain] view plaincopy \begin{tabular}{m{5cm}} 法二: [plain] view plaincopy \begin{tabular}{p{0.9\ ...

  4. Android初级教程理论知识(第六章广播接受者)

    总体概述: 广播接收者 现实中:电台要发布消息,通过广播把消息广播出去,使用收音机,就可以收听广播,得知这条消息 Android中:系统在运行过程中,会产生很多事件,那么某些事件产生时,比如:电量改变 ...

  5. Android进阶(二十七)Android原生扰人烦的布局

    Android原生扰人烦的布局 在开发Android应用时,UI布局是一件令人烦恼的事情.下面主要讲解一下Android中的界面布局. 一.线性布局(LinearLayout) 线性布局分为: (1) ...

  6. Mybatis源码分析之结果封装ResultSetHandler和DefaultResultSetHandler

    ResultSetHandler负责处理两件事: (1)处理Statement执行后产生的结果集,生成结果列表 (2)处理存储过程执行后的输出参数ResultSetHandler是一个接口,提供了两个 ...

  7. ffmpeg.c函数结构简单分析(画图)

    前一阵子研究转码的时候看了FFmpeg的源代码.由于ffmpeg.c的代码相对比较长,而且其中有相当一部分是AVFilter有关的代码(这一部分一直不太熟),因此之前学习FFmpeg的时候一直也没有好 ...

  8. String之常量池小结

    1.String 常量池 String使用private final char value[ ]实现字符串的存储,也就是说String创建对象之后不能够再次修改此对象中存储的字符串内容,因而Strin ...

  9. jquery easyui datagrid 分页实现---善良公社项目

    接着上篇文章,接下来给大家分享分页的实现,分页其实多多少少见过很有几种,框架中带的图片都特别的好看,会给用户以好的使用效果,具体实现,需要自己来补充代码: 图示1: 通常情况下页面数据的分页显示分成真 ...

  10. 检查一个二叉树是否平衡的算法分析与C++实现

    今天面试一个实习生,就想既然是未出校园,那就出一个比较基础的题吧,没想到答的并不如人意,对于树的操作完全不熟悉,因此此题算是未作答.原来我想看一下他分析问题的思路,优化代码的能力.接下来会把最近半年我 ...