可每日自动计算年龄,精确到三位小数,需要安装dataview插件并开启inline功能
将下列代码1处出生年份和3处出生日期换成自己的就可以用啦
今天的你,已经==`=choice(date(now) > date(number(dateformat(date(now), "yyyy")) + "-01-15"),number(dateformat(date(eom), "yyyy")) - number(1981) + round((number(dateformat(date(now), "ooo")) - number(dateformat(date(number(dateformat(date(now), "yyyy")) + "-01-15"), "ooo"))) / number(dateformat(date(number(dateformat(date(now), "yyyy")) + "-12-31"), "ooo")) ,3),choice(date(now) < date(number(dateformat(date(now), "yyyy")) + "-01-15"),number(dateformat(date(eom), "yyyy")) - number(1998) - round((number(dateformat(date(now), "ooo")) - number(dateformat(date(number(dateformat(date(now), "yyyy")) + "-01-01"), "ooo"))) / number(dateformat(date(number(dateformat(date(now), "yyyy")) + "-12-31"), "ooo")) ,3),"ERROR"))`==岁啦
1 个赞
kerwin
(kang)
2
好用!是不是只需要修改1981为自己的出生年份就可以了
作者大大,我改进了一下你的代码,起因是我2月3日生日,明明现在应该是21.94岁,但是代码算出来却是21.97岁,一气之下花了几小时改了一下。
我觉得问题之一是:当今天的日期比今年生日早时,计算小数时还减去了1月1号的绝对天数——1,这是不必要的。不过仅仅1天也不该有这么大的误差,可能还有其它问题。
我改进后,当今天的日期比今年生日早时,就会与去年的生日比较,计算小数时使用的除数也是去年的天数而非今年的天数。
代码呈上
=choice(date(now) > date(number(dateformat(date(now), "yyyy")) + "-02-03"),number(dateformat(date(now), "yyyy")) - number(2002) + round((number(dateformat(date(now), "ooo")) - number(dateformat(date(number(dateformat(date(now), "yyyy")) + "-02-03"), "ooo"))) / number(dateformat(date(number(dateformat(date(now), "yyyy")) + "-12-31"), "ooo")),3),choice(date(now) < date(number(dateformat(date(now), "yyyy")) + "-02-03"),number(dateformat(date(now), "yyyy")) - number(1) - number(2002) + round((number(dateformat(date(now), "ooo")) + number(dateformat(date(number(dateformat(date(now), "yyyy")) - number(1) + "-12-31"), "ooo")) - number(dateformat(date(number(dateformat(date(now), "yyyy")) - number(1) + "-02-03"), "ooo"))) /number(dateformat(date(number(dateformat(date(now), "yyyy")) - number(1) + "-12-31"), "ooo")),3),"ERROR"))
3 个赞
楼主都说了呀,改年份和日期为自己的就行,我的那个式子就是把2002改成你的出生年,-02-03改成你的出生日期。目前这个式子就是两位小数的
大佬您好,在使用了您的代码后我深感敬佩。
我将这段代码用于计算我朋友的年龄,感觉非常好用,这个结果甚至能够精确到小数点后两位。但是另一个问题来了,如果每一次都修改好几个地方的话,会有大量的工作要做,因此我就在想能不能用用代码把yaml里的”出生年份“和”出生日期“的值动态地替换到这段代码中对应的部分。
这个下午我尝试了多种方式,反复和chatgpt交流,也看了一些社区的代码,但始终都没有相对完美地解决这个问题,因此我想请教大佬有没有办法解决这个问题呢。
0v0
(0v0)
11
使用dataviewjs可以精确到小数点后15位,每毫秒都在变化。
const now = new Date();
const birthday = new Date("填入你的生日");
dv.span((now-birthday)/1000/60/60/24/365);
1 个赞
cscs
(cscs)
12
const now = new Date();
const birthYear = 2000; //年
const birthMonth = 0; //月
const birthDay = 0; //日
const birthDate = new Date(birthYear, birthMonth - 1, birthDay); // 创建Date对象时,月份减1,因为Date对象的月份是0开始计数
const currentYear = now.getFullYear();
// 计算一年中的第几天的函数
const dayOfYear = date => Math.floor((date - new Date(date.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24));
// 获取重要日期在一年中的第几天
const dayOfYearNow = dayOfYear(now);
const dayOfYearBirth = dayOfYear(birthDate);
const dayOfYearDec31 = dayOfYear(new Date(currentYear, 11, 31)); // 12月31日,月份从0开始计数
let age;
if (now > new Date(currentYear, birthMonth - 1, birthDay)) { // 比较当前日期与当年生日
const daysSinceBirth = dayOfYearNow - dayOfYearBirth;
const fractionOfYear = daysSinceBirth / dayOfYearDec31;
age = (currentYear - birthYear + fractionOfYear).toFixed(3);
} else {
const prevYear = currentYear - 1;
const prevDec31 = new Date(prevYear, 11, 31); // 上一年的12月31日,月份从0开始计数
const dayOfYearPrevDec31 = dayOfYear(prevDec31);
const dayOfYearPrevBirth = dayOfYear(new Date(prevYear, birthMonth - 1, birthDay)); // 上一年生日
const fractionOfYear = (dayOfYearNow + dayOfYearPrevDec31 - dayOfYearPrevBirth) / dayOfYearPrevDec31;
age = (currentYear - 1 - birthYear + fractionOfYear).toFixed(3);
}
dv.el("div", `今天的你,已经 ${age} 岁啦`);
对上述代码进行了整理和易读,希望各位喜欢
你好,我其实也不太懂这几行代码,完全是照猫画虎地尝试和修改得到的结果。根据我查到的粗浅结果,行内公式似乎不能定义常变量?下面两个大佬的回复我也没有尝试成功,可能不是行内查询?
我看了一下Dataview的官方页面,或许你可以尝试一下把同文件夹下的笔记文件名称改为生日数字?因为我试了一下,= this.file.name
确实可以得到文件名结果,你可以试试把这个东西代替进表达式里。但是问题在于这个文件名Dataview会不会当成数字处理。
Anyway,这个功能就是楼主看到Dataview有行内查询这个功能后有创意地改造出地小玩意,因此有瑕疵是正常的,毕竟不是Dataview的主要用途,图一乐就行啦
0v0
(0v0)
14
定义变量的代码使用的是Dataviewjs。
通过在代码块中标注dataviewjs
运行,需要在Dataview设置 > “Enable JavaScript queries” 下选择开启。
const now = new Date();
const birthday = new Date("2000-1-1"); // 修改为自己的生日
dv.span(`今天的你,已经${(now-birthday)/1000/60/60/24/365}岁啦`);
感谢大佬!尝试之后确实可以了!之前没成功原来是因为网页上复制的内容,复制到ob里后所有换行都失效了,所以代码乱掉了