标签: strftime

使用不受信任的格式字符串安全地调用strftime

我们有一个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)

这看起来确实有效,并且允许我在我"期望"它们发生的情况下显式地捕获(并且优雅地处理)无效的参数异常.但是,我担心我会在大型应用程序中覆盖全局的运行时设置以解决相对"本地"的问题 - 我讨厌这个修复程序在其他地方引起其他问题.

这种方法是否明智?或者是否有更清洁的方法来解决这个问题?

validation mfc strftime

5
推荐指数
1
解决办法
1906
查看次数

俄语月份名称错误

我正在开发一个网站,我的客户来自俄罗斯。他说,新闻中的月份翻译是错误的。

\n\n

例如,九月:

\n\n
    \n
  • 我从 php 得到这个:\xd0\xa1\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8c
  • \n
  • 这是他的:\xd0\xa1\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8f
  • \n
\n\n

我怎样才能覆盖这个?

\n\n

说明:\n使用区域设置时ru_RU,输出的月份名称将为俄语。但据我的客户说,月份的名称是错误的。我不会说俄语,所以我不知道他是对还是错

\n\n

我刚刚看到,如果我将日期从: 翻译8th of September 2011成俄语,它将看起来像这样:8 \xd1\x81\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8f 2011看翻译

\n\n

因此,解决该问题的方法可能是重写日期格式。

\n\n

我还没有解决这个问题;显然这是一个错误/缺失的功能,因为俄罗斯的先进的词尾变化。而且我需要的日期格式不存在。我认为这会影响strftimePHPdate()

\n\n

有人可以验证这一点吗?

\n

php strftime

5
推荐指数
1
解决办法
3495
查看次数

使用 strftime() 获取 utc 时间戳

我正在尝试使用以下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)

c datetime glibc time-t strftime

5
推荐指数
1
解决办法
9058
查看次数

转换为 R 中的本地时间 - 时区向量

我有一组来自美国各地的数据,我正在尝试将其转换为每个“主题”的当地时间。我对每个事件都有 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

谢谢,速记

format timezone strftime posixct posixlt

5
推荐指数
1
解决办法
1649
查看次数

python ISO 8601 日期格式

我正在尝试像这样格式化日期,

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 iso8601 strftime

5
推荐指数
1
解决办法
1万
查看次数

有没有比Python的strftime更快的替代方法?

我正在用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)

有没有更快的选择?

python strftime

5
推荐指数
1
解决办法
1719
查看次数

如何使用 ffmpeg 从使用时间戳命名的帧创建视频

我有一个充满框架的文件夹,其名称中的时间戳采用以下格式

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)

video powershell mp4 ffmpeg strftime

5
推荐指数
1
解决办法
2595
查看次数

用leap年计算一年中的天数

我目前正在尝试用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)

r date strftime leap-year lubridate

5
推荐指数
1
解决办法
229
查看次数

创建带小数秒的时间戳

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)

awk timestamp strftime

5
推荐指数
1
解决办法
1864
查看次数

如何以diff命令返回的格式在perl中获取文件的最后修改时间?

我想以与 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。你能帮我附加其他信息吗?

perl diff strftime stat

5
推荐指数
1
解决办法
765
查看次数

标签 统计

strftime ×10

python ×2

awk ×1

c ×1

date ×1

datetime ×1

diff ×1

ffmpeg ×1

format ×1

glibc ×1

iso8601 ×1

leap-year ×1

lubridate ×1

mfc ×1

mp4 ×1

perl ×1

php ×1

posixct ×1

posixlt ×1

powershell ×1

r ×1

stat ×1

time-t ×1

timestamp ×1

timezone ×1

validation ×1

video ×1