我的日期格式为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的结果无论如何都是旧值。
怎么了?
答案 0 :(得分:1)
您正在尝试表示值与实际值的对比。
实际上所有dateTime都是一个无符号的Int64,它计算自“点X”以来的刻度数(通常是Unix时间的开始,1970年1月1日,00:00:00)。但用户无法使用它。它们需要人类可读的字符串格式。 Langauges也不同,更不用说文化区域了。英国和美国都说英语,但不能决定月份或日期是否应该是第一位。
ToString()和Parse()函数都旨在自动提取Number应该从Windows的Region设置中看作字符串的正确方式。作为调试器一部分的ToString()函数也不例外。
答案 1 :(得分:0)
DateTime
由number(滴答)支持。它完全没有人类可读的表现形式!当您创建DateTime(通过单独指定每个日期组件或通过解析日期字符串)时,它会将字符串日期转换为刻度。
那么你在调试器中看到了什么?嗯,这是DateTime对象的默认ToString()
方法的结果。这取决于运行代码的线程的 culture 。除非您更改它,否则它将默认与操作系统文化相同。
同样,在解析日期时也使用这种文化,因此在英国5/1/2018将被DateTime.Parse(...)
理解为2018年1月5日,而在美国,它将被理解为2018年5月1日。
您应该如何使用这些信息?
了解调试器中使用的日期格式是基于您的计算机文化,并且它对于DateTime对象在其他文化中的计算机上的执行方式没有任何意义。
如果要向用户显示日期,则需要使用ToString()
方法(存在一些重载)来生成按照您希望的方式格式化的日期。当然,如果您只是想为最终用户的文化格式化它,那么无参数ToString()
方法将正常工作。
如果您需要发送特定格式,则应再次使用其中一个ToString()
重载。例如,您可以传递格式o
:DateTime.UtcNow.ToString("o")
,它将以符合ISO8601标准的格式打印日期:2018-04-28T15:31:00.000Z
您可以找到不同的格式字符串here(MS docs)。
最后一件事:“在db中,我必须将其写为yyyy/M/d hh:mm:ss tt
。”
如果您使用的是SQL数据库(SQL Server,MySQL等)并且在数据库中使用日期类型字段,则应使用参数构建SQL查询。您根本不需要格式化日期,您只需将DateTime
对象作为参数传递。
有关SQL注入漏洞以及如何使用参数化查询的详细信息,请参阅here。