【问题标题】:Return the time properly formatted返回正确格式化的时间
【发布时间】:2019-01-25 21:58:51
【问题描述】:

我有这段代码,当单击按钮时,它会返回当前时间。但是,它以一种非常难以理解的格式返回时间。如何格式化以使其看起来更好?

using System;
using Microsoft.AspNetCore.Mvc;
using Clockwork.API.Models;

namespace Clockwork.API.Controllers
{
[Route("api/[controller]")]
public class CurrentTimeController : Controller
{
    // GET api/currenttime
    [HttpGet]
    public IActionResult Get()
    {
        var utcTime = DateTime.UtcNow;
        var serverTime = DateTime.Now;
        var ip = this.HttpContext.Connection.RemoteIpAddress.ToString();

        var returnVal = new CurrentTimeQuery
        {
            UTCTime = utcTime,
            ClientIp = ip,
            Time = serverTime
        };

        using (var db = new ClockworkContext())
        {
            db.CurrentTimeQueries.Add(returnVal);
            var count = db.SaveChanges();
            Console.WriteLine("{0} records saved to database", count);

            Console.WriteLine();
            foreach (var CurrentTimeQuery in db.CurrentTimeQueries)
            {
                Console.WriteLine(" - {0}", CurrentTimeQuery.UTCTime);
            }
        }

        return Ok(returnVal);
    }
}
}

返回如下:

 {"currentTimeQueryId":15,"time":"2018-08-19T11:44:54.3348267-04:00","clientIp":"127.0.0.1","utcTime":"2018-08-19T15:44:54.3348267Z"}

【问题讨论】:

  • {0:dd MMM yyyy HH:mm:ss} 是众多格式化选项之一...
  • 您希望它采用什么特定格式?您通常使用某种格式的DateTime.ToString
  • @CamiloTerevinto:如果您将其展示给用户,那当然可以。如果您尝试创建像 JSON 这样的机器可读格式,那么 ISO-8601 几乎总是最合适的格式。
  • @DaisyShipton 好吧,“看起来更好”对我来说听起来不像是机器可读的格式:)
  • @CamiloTerevinto:但输出是 JSON。这不是设计为人类可读的。如果目标是向人类显示数据,那么 JSON 不是用于该目的的最佳格式。基本上,OP 需要决定一种方式或另一种方式:人类消费(不是 JSON,可能对文化敏感)或机器消费(JSON,对文化不敏感)。

标签: c# asp.net-core


【解决方案1】:

你根本不应该尝试改变它。

这是一个 ISO-8601 格式的日期和时间,包括 UTC 偏移量。这很好 - 几乎任何系统都可以轻松解析。它是明确的,并且没有任何特定于文化的细节,如日期和月份名称。这很棒 - 可供机器阅读。

您正在生成 JSON,它旨在 机器 可读,而不是 人类 可读。当然,作为一种交换格式,它 非常易读,但它并不打算显示给最终用户。相反,无论将数据呈现给最终用户,都应该执行适合日期/时间值的任何格式。 尝试以机器专用的数据传输格式(在本例中为 JSON)执行此操作非常重要,因为它通常会导致模棱两可或毫无意义的文化敏感性。

请注意,这不仅适用于日期和时间。以一个数值为例:虽然 10.5 对您来说可能是“人类可读的”,但法国人却不希望看到“10 半”。他们会将其格式化为“10,5”。但我不建议在 JSON 中使用该字符串:我将其设为 10.5(作为数字,而不是字符串1),然后执行“数字到人类可读格式”的转换在 Javascript 中。

基本上,在您的数据管道中一直保持数据与表示无关,直到它到达表示层,该表示层应该具有为实际用户理想地格式化所需的所有文化信息。很多时候,您没有在管道中的其他地方拥有所有文化信息。


1 除非您在尝试表示严格的十进制数时尝试将 JSON 解释为二进制浮点数。遗憾的是 JSON 中没有真正的十进制格式。

【讨论】:

  • 有没有办法显示机器可读和人类可读。它应该是一个显示时间的应用程序,并不是真正的机器可读。
  • @BThomps:什么是显示时间的应用?什么在消耗 JSON?如果它是 Web 应用程序,则在此处格式化日期/时间。请记住,不同的人可能希望以不同的方式查看数据。例如,今天在英国是 20/08/2018,而在美国有人写成 08/20/2018。对于像“8 月 7 日”这样的日期变得模棱两可。您可以使用月份名称消除这种歧义 - 但您使用哪种语言来命名?这些都是文化问题,通常应该由表示层处理。
  • 我要问的问题的格式是什么语法。
  • @BThomps:格式化什么的语法,在哪里?不清楚您的上下文是什么:什么在消耗这个 JSON? 这就是应该执行格式化的内容,IMO。如果那是 Javascript,那么您应该研究如何在 Javascript 中格式化日期/时间值。
  • 我只是希望下面的代码以更易于阅读的格式显示。 {"currentTimeQueryId":15,"time":"2018-08-19T11:44:54.3348267-04:00","clientIp":"127.0.0.1","utcTime":"2018-08-19T15:44: 54.3348267Z"}
【解决方案2】:

你可以试试

DateTime.Now.ToShortTimeString();

【讨论】:

  • 除非它正在生成 JSON,否则这是一个坏主意 - 之后任何试图读取 JSON 的东西都可能会模棱两可。这个想法是 JSON 是 机器可读的,OP 的输出已经是。
猜你喜欢
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多