我们有一个C++/MFC应用程序,允许用户通过配置文件自定义日期格式.我不想重新发明轮子,我将格式字符串传递给CTime :: Format("<format string>")来进行实际的格式化.在封面下,Format调用标准C函数strftime()的变体.
当然,用户可能会意外输入无效的格式字符串.(例如,"%s"而不是"%S".)发生这种情况时,C运行时调用无效参数处理程序,默认情况下退出应用程序.(没有例外可以捕获 - 只需app退出.)
我的问题是如何优雅地处理这种不受信任的输入.从理论上讲,我可以为格式字符串编写自己的解析器/验证器,但这听起来像是浪费时间.相反,我能想到的最好的方法是设置我自己的(全局)无效参数处理程序,它不会退出,而是抛出一个无效参数异常:
void MyInvalidParameterHandler(
const wchar_t* expression,
const wchar_t* function,
const wchar_t* file,
unsigned int line,
uintptr_t pReserved)
{
::AfxThrowInvalidArgException();
}
Run Code Online (Sandbox Code Playgroud)
这看起来确实有效,并且允许我在我"期望"它们发生的情况下显式地捕获(并且优雅地处理)无效的参数异常.但是,我担心我会在大型应用程序中覆盖全局的运行时设置以解决相对"本地"的问题 - 我讨厌这个修复程序在其他地方引起其他问题.
这种方法是否明智?或者是否有更清洁的方法来解决这个问题?
我正在开发一个网站,我的客户来自俄罗斯。他说,新闻中的月份翻译是错误的。
\n\n例如,九月:
\n\n\xd0\xa1\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8c\xd0\xa1\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8f我怎样才能覆盖这个?
\n\n说明:\n使用区域设置时ru_RU,输出的月份名称将为俄语。但据我的客户说,月份的名称是错误的。我不会说俄语,所以我不知道他是对还是错
我刚刚看到,如果我将日期从: 翻译8th of September 2011成俄语,它将看起来像这样:8 \xd1\x81\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8f 2011。看翻译。
因此,解决该问题的方法可能是重写日期格式。
\n\n我还没有解决这个问题;显然这是一个错误/缺失的功能,因为俄罗斯的先进的词尾变化。而且我需要的日期格式不存在。我认为这会影响strftimePHPdate()。
有人可以验证这一点吗?
\n我正在尝试使用以下strftime函数将当前 UTC 时间编码为字符串:
time_t now;
struct tm nowLocal;
struct tm nowUtc;
now = time(NULL);
localtime_r(&now, &nowLocal);
gmtime_r(&now, &nowUtc);
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利:nowLocal包含我的时区 (CET) 中的当前时间,nowUtc包含 UTC 时间,差异完全取决于tm_gmtoff值:
nowLocal: {tm_sec = 28, tm_min = 27, tm_hour = 13, tm_mday = 23,
tm_mon = 4, tm_year = 112, tm_wday = 3, tm_yday = 143,
tm_isdst = 1, tm_gmtoff = 7200, tm_zone = 0x8127a38 "CEST"}
nowUtc: {tm_sec = 28, tm_min = 27, tm_hour = 11, tm_mday = 23,
tm_mon …Run Code Online (Sandbox Code Playgroud) 我有一组来自美国各地的数据,我正在尝试将其转换为每个“主题”的当地时间。我对每个事件都有 UTC 时间戳,并将其转换为 POSIXct 格式,但每次我尝试在任何 POSIXct/POSIXlt 函数(包括和)中包含tz = DS$Factor或 的向量时,都会收到一条错误消息:tz = as.character(DS$Factor)format()strftime()
as.POSIXlt.POSIXct(x, tz = tz) 中的错误:无效的“tz”值
如果我只是输入tz = 'US/Eastern'它就可以正常工作,但当然并非我的所有值都来自该时区。
如何将每个“主题”的时间戳记为当地时间?
有DS$Factor5 个值:US/Arizona US/Central US/Eastern US/Mountain US/Pacific
谢谢,速记
我正在尝试像这样格式化日期,
2015-12-02T12:57:17+00:00
这是我的代码
time.strftime("%Y-%m-%dT%H:%M:%S%z", time.gmtime())
Run Code Online (Sandbox Code Playgroud)
这给出了这个结果,
2015-12-02T12:57:17+0000
我看不到任何其他可以提供 +00:00 格式的 %z 变体?解决这个问题的正确方法是什么?
我正在用Python处理数十万个日期,并注意到该strftime函数非常慢。
我使用timeit进行检查,它告诉我大约需要0.004,这对于少量数字是好的,但是例如处理几千个就变得有问题。
print(min(timeit.Timer("now.strftime('%m/%d/%Y')", setup=setup).repeat(7,1000))
Run Code Online (Sandbox Code Playgroud)
有没有更快的选择?
我有一个充满框架的文件夹,其名称中的时间戳采用以下格式
im_%H_%M_%S_%MS.png
im_08_05_09_007324.png
im_08_05_09_532857.png
im_08_05_10_059340.png
im_08_05_10_575862.png
im_08_05_11_118361.png
im_08_05_11_596814.png
im_08_05_12_148340.png
im_08_05_12_665838.png
Run Code Online (Sandbox Code Playgroud)
我尝试在windows中使用-pattern_type glob,但不起作用。
ffmpeg.exe -framerate 10 -pattern_type glob -i im_*.png -c:v libx264 -r 30 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -pix_fmt yuv420p $videoName
Run Code Online (Sandbox Code Playgroud)
我明白了
Pattern type 'glob' was selected but globbing is not supported by this libavformat build im_*.png: Function not implemented
Run Code Online (Sandbox Code Playgroud)
后来我发现这在 Windows 上不起作用:( 这就是我正在使用的。ffmpeg 错误:选择了模式类型“glob”,但此 libavformat 版本不支持 globbing
我也尝试
ffmpeg.exe -framerate 10 -pattern_type glob -i im_%02d_%02d_%02d_%06d.png -c:v libx264 -r 30 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -pix_fmt yuv420p $videoName
Run Code Online (Sandbox Code Playgroud)
我有
im_%02d_%02d_%02d_%06d.png: No such file …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试用R进行编码。我想使用一个日期%Y-%m-%d格式(例如:2017-12-31)并将其转换为一年中的某天。但是,我希望始终将02/28视为第59天,将03/01视为第61天。如果不是a年,它将跳过#60。这样,01/01始终是#1,而12/31始终是#366。
我已经尝试过使用strftime()和yday(),但是当这是a年时,两者都不会跳过第60天。根据是否是a年,它将使12/31成为第365天或#366天。
如果有人对我如何用R编写代码有任何见解,那就太好了!非常感谢。
file <- read.table("PATHTOMYFILE", fill = TRUE, header = TRUE)
file <- file[-c(1), ]
file$datetime <- as.Date(as.character(file$datetime))
file <- file[which(file$datetime <= as.Date("2017-09-30")), ]
file$x <- file[, 4]
file$x <- as.numeric(as.character(file$x))
# Year-day function
yearday <- function(d){
# Count previous months
yd <- ifelse(lubridate::month(d) > 1, sum(lubridate::days_in_month(1:
(lubridate::month(d)-1))), 0)
# Add days so far in month & extra day if after February
yd <- yd + lubridate::day(d) + ifelse(lubridate::month(d)>2, 1, 0)
yd
} …Run Code Online (Sandbox Code Playgroud) awk可以使用 strftime 函数生成时间戳,例如
$ awk 'BEGIN {print strftime("%Y/%m/%d %H:%M:%S")}'
2019/03/26 08:50:42
Run Code Online (Sandbox Code Playgroud)
但我需要一个带有小数秒的时间戳,最好是纳秒。gnu date可以用以下%N元素做到这一点:
$ date "+%Y/%m/%d %H:%M:%S.%N"
2019/03/26 08:52:32.753019800
Run Code Online (Sandbox Code Playgroud)
但与调用相比,date从内部调用的效率相对较低,而且我需要高性能,因为我正在处理许多大文件,并且需要在处理文件时生成许多时间戳。有没有一种方法可以有效地生成包含小数秒的时间戳(理想情况下是纳秒,但毫秒也是可以接受的)?awkstrftimeawkawk
添加我正在尝试执行的示例:
awk -v logFile="$logFile" -v outputFile="$outputFile" '
BEGIN {
print "[" strftime("%Y%m%d %H%M%S") "] Starting to process " FILENAME "." >> logFile
}
{
data[$1] += $2
}
END {
print "[" strftime("%Y%m%d %H%M%S") "] Processed " NR " records." >> logFile
for (id in data) {
print id …Run Code Online (Sandbox Code Playgroud) 我想以与 linuxdiff命令显示的格式相同的格式显示时间。
D:\>diff -dub old.cfg new.cfg
--- old.cfg 2019-05-15 15:03:14.289950700 +0530
+++ new.cfg 2019-05-14 16:07:21.119695300 +0530
Run Code Online (Sandbox Code Playgroud)
我想将文件的上次修改时间显示为2019-05-15 15:03:14.289950700 +0530.
我用过,stat但我没有得到纳秒部分。Alo,需要给定格式的时区。我也试过Time::HiRes,但是无法得到。
my $dt = strftime("%Y-%m-%d %H:%M:%S", localtime((stat($old_file))[9]));
Run Code Online (Sandbox Code Playgroud)
它返回:2019-05-15 15:03:14。你能帮我附加其他信息吗?