无论如何转换为yyyy / M / d的日期时间转换为M / d / yyyy

时间:2018-04-27 15:10:56

标签: c# datetime

我的日期格式为11/19/2017 12:00:40 AM,我希望将其转换为2017/11/19 12:00:40 AM

class UserProfileLanguageFilter(admin.SimpleListFilter):
    title = _('Language')
    parameter_name = 'languages'

    def lookups(self, request, model_admin):
        qs = model_admin.get_queryset(request)
        # Return a list of (id, name) for lookups. We return the language_id and the string format "Language Name (Count of Users)" as the name.
        return [(i, "{}({})".format(j, k)) for i, j, k in
                qs.values_list('languages__id', 'languages__name').annotate(
                    user_count=Count('userprofile')).distinct().order_by(
                    'languages__name')]

    def queryset(self, request, queryset):
        if self.value():  # Use the lookup id we sent above; to filter
            return queryset.filter(languages__id=self.value())


@admin.register(UserProfile):
class UserProfileAdmin(admin.ModelAdmin):
    # ...
    list_filter = (UserProfileLanguageFilter,)

d的值实际上是2017/11/19 12:00:40 AM,但它是字符串。在db中,我必须将其写为var d = DateTime.ParseExact("11/19/2017 12:00:40 AM", "M/d/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture).ToString("yyyy/M/d hh:mm:ss tt"); var dt = DateTime.ParseExact(d, "yyyy/M/d hh:mm:ss tt", CultureInfo.InvariantCulture);

但是dt的结果无论如何都是旧值。

enter image description here

怎么了?

2 个答案:

答案 0 :(得分:1)

您正在尝试表示值与实际值的对比。

实际上所有dateTime都是一个无符号的Int64,它计算自“点X”以来的刻度数(通常是Unix时间的开始,1970年1月1日,00:00:00)。但用户无法使用它。它们需要人类可读的字符串格式。 Langauges也不同,更不用说文化区域了。英国和美国都说英语,但不能决定月份或日期是否应该是第一位。

ToString()和Parse()函数都旨在自动提取Number应该从Windows的Region设置中看作字符串的正确方式。作为调试器一部分的ToString()函数也不例外。

答案 1 :(得分:0)

DateTimenumber(滴答)支持。它完全没有人类可读的表现形式!当您创建DateTime(通过单独指定每个日期组件或通过解析日期字符串)时,它会将字符串日期转换为刻度。

那么你在调试器中看到了什么?嗯,这是DateTime对象的默认ToString()方法的结果。这取决于运行代码的线程的 culture 。除非您更改它,否则它将默认与操作系统文化相同。

同样,在解析日期时也使用这种文化,因此在英国5/1/2018将被DateTime.Parse(...)理解为2018年1月5日,而在美国,它将被理解为2018年5月1日。

您应该如何使用这些信息?

  1. 了解调试器中使用的日期格式是基于您的计算机文化,并且它对于DateTime对象在其他文化中的计算机上的执行方式没有任何意义。

  2. 如果要向用户显示日期,则需要使用ToString()方法(存在一些重载)来生成按照您希望的方式格式化的日期。当然,如果您只是想为最终用户的文化格式化它,那么无参数ToString()方法将正常工作。

  3. 如果您需要发送特定格式,则应再次使用其中一个ToString()重载。例如,您可以传递格式oDateTime.UtcNow.ToString("o"),它将以符合ISO8601标准的格式打印日期:2018-04-28T15:31:00.000Z

  4. 您可以找到不同的格式字符串here(MS docs)。

    最后一件事:“在db中,我必须将其写为yyyy/M/d hh:mm:ss tt。”

    如果您使用的是SQL数据库(SQL Server,MySQL等)并且在数据库中使用日期类型字段,则应使用参数构建SQL查询。您根本不需要格式化日期,您只需将DateTime对象作为参数传递。

    有关SQL注入漏洞以及如何使用参数化查询的详细信息,请参阅here