正邦巨亏的原因找到了!金币求助一段代码~~



4月21日正邦公布重整延期,短线最大的退市风险解除,那几天加班加昏了头,楼主看了公告,几分钟之内就决定买入,一早红盘买入,然后被杀的稀里哗啦。。。
原来,买入时完全忘了即将公布年报,然后披星戴月。。。

为啥会忘呢,因为最近工作太忙,尤其是一个浪Chao软件开发的一个项目尤其恼人!浪C软件的码农简直让我哭笑不得,很多很简单的东西居然都搞不定,有时候真把我气的笑了。。。

举个简单的例子,设备定期检测,检测合格要刷新有效期,公式是:
有效日期=检测日期+检测周期(月)-1天;
例如今天2023-4-29检测,检测周期是12个月,则有效日期=检测日期+12个月-1天=2024-04-28;
检测周期有6个月、12个月、24个月、60个月不等。
逻辑很清楚吧。
且看浪C软件的码农是怎么干的。。。

回合一:
浪C软件的码农写完代码,我一测试,发现有效日期跟理论值差了五六天的样子,就问他是怎么计算的,他说是将检测周期(月)乘以30,加上检测日期再减一天,就得到了有效日期,我说这样肯定不对啊,这样一年只有360天了,差了好几天!
我说在excel中很简单啊,直接加月份就可以了。
浪C软件的码农答曰,在浪C的软件中没有封装类似的功能,不能直接调用,只能自己写代码。
那就只好让他再改下。

回合二:
浪C软件的码农改完代码,这次我学乖了,我先问他,是怎么计算的,他说是用检测周期(月)除以12,再乘以365,加上检测日期,就得到了有效日期。我说这样遇到闰年肯定就有问题啊,一年366天,有效日期就差了一天,而且没有办法修改,肯定不行啊!

回合三:
回合二不是差了一天没有办法修改嘛,这次浪C软件的码农学乖了,直接用检测日期+检测周期(天)-1天,检测周期(天)-1天设置默认值,检测周期如果是一年,那默认值就设置为365-1=364天。如果闰年怎么办,那就需要手动修改为365;到了闰年的第二年,又需要将365改回364。如果检测周期如果是6个月,由于需要考虑闰年,备选值就有180/181/182/183/184。。。

我彻底崩溃了。。。浪C软件这么大的公司,做的软件怎么这么水!!!
由于没有想到好的解决思路,这个问题目前暂时放一边了,但是如果后续如果没有好的办法,很可能就这样了。

五一外面人太多,加上最近比较忙,我没有出去玩,先休息下。
抽空又想了一下这个问题,由于闰年的影响,还有周期6个月的起始时间要受到大月31天、小月30天的影响,貌似确实还挺复杂的。

不过这应该是个会经常遇到的问题,只好请教下各位高手,有没有好的算法或者代码,如果能够提供有效信息的金币答谢,如果能够完美解决的话,大量金币答谢。
先行谢过了~~
发表时间 2023-04-29 10:58     来自四川

赞同来自: eeoo 海之央 qwsd54362627 Klaus199008

0

IT可乐

赞同来自:

我们好像是同行,你是做设备管理对吧。
2023-12-22 12:36 来自江西 引用
0

樊健

赞同来自:

加个表呀, 2023到2099, 每个月多少天
2023-05-21 22:29 来自上海 引用
0

yaya0614

赞同来自:

你的正邦还在吗
2023-05-21 21:03 来自上海 引用
3

我不叫小梁

赞同来自: seancai110 dingo49 zoetina52

闰年这种事情,建议直接写死,往后20年的天数写成一个数组就行了,反正你软件也不可能用20年,真用20年你也找不到当事人了
2023-05-19 18:47 来自广东 引用
1

塔塔桔

赞同来自: seancai110

汗,进来看正邦的。。。
没想到看到的是‘蚂蜂窝’
2023-05-12 18:17 来自福建 引用
0

纬度转五

赞同来自:

1、看着满屏的技术讨论有点恍惚,我真的没来错论坛吗?
2、按楼主说的情况,提供服务的应该是浪潮国际(港股上市公司)而非浪潮软件。但严重怀疑楼主是看浪潮信息涨太多眼红,想把他拖下水。
2023-05-06 09:00 来自山东 引用
0

大道之行也 - 大道至简,大道止简;简单投资,静待花开!

赞同来自:

我曾用过某国产ERP,被整到疯魔,问技术人员为啥不做的傻瓜一些
这个技术人员竟然说:你们高科技企业(实际上是工程企业,申请高科技的原因大家都懂的),学历起码也本科,怎么还提这样的要求
顿觉无语
2023-05-06 08:21 来自北京 引用
0

急死菜鸟

赞同来自:

做一个年月和天数的对应表不就行了,几分钟解决
2023-05-06 08:15 来自湖南 引用
2

慕容燕

赞同来自: seancai110 dingo49

C语言中对这种计算是比较麻烦,所以很多公司会对这些规则做自己的加工,做好通用函数。如果通用的函数没人写好,有个变通的方式,就是如果连数据库了,可以直接调用数据库的add_months函数,不需要自己去计算闰年这些,相对比较简单。
2023-05-06 07:03 来自香港 引用
1

coolie

赞同来自: 向死向生

不知道什么编程语言,不过绝大多数编程语言都可以给时间加月吧,检测周期是几个月就加几个月。再日期减一。不管大小月闰年,都不会错的。我说的是类似c#中addmonths这种
2023-05-02 14:10 来自广东 引用
3

csfires - 毛顿的整活空间

赞同来自: tianshen1994 时间的味道 dingo49

想了下,最简便的方法貌似是把年月日拆出来去做加加减减最简单,譬如检测日期为2022-02-28,有效期1年1月0日,则为2023年3月28日,应当是较为简单的实现方式了。

浪C有好几个子公司,都不是一批人,A股的几家,有软件有硬件,还有港股的。

include <stdio.h>

include <stdlib.h>

include <time.h>

// 定义月份天数的数组,根据实际情况进行调整
const int days_of_month[] = {31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31};

int main(){
int year, month, day; // 检测日期的年月日
int test_period = 12; // 检测周期
int days_of_test_period; // 检测周期的天数

// 获取检测日期的年月日
printf("请输入检测日期(格式为YYYY-MM-DD):");
scanf("%d-%d-%d", &year, &month, &day);

// 获取检测周期的天数
switch(test_period){
case 6:
days_of_test_period = 180;
break;
case 12:
days_of_test_period = 365;
break;
case 24:
days_of_test_period = 730;
break;
case 60:
days_of_test_period = 1825;
break;
default:
printf("无效的检测周期!\n");
return -1;
}

// 计算有效日期
year += (month + test_period - 1) / 12;
month = (month + test_period - 1) % 12 + 1;
day += days_of_test_period;

while(day > days_of_month[month - 1]){
day -= days_of_month[month - 1];
month++;
if(month == 13){
year++;
month = 1;
}
}

// 输出结果
printf("检测日期:%d-%02d-%02d\n", year, month, day);
printf("检测周期:%d个月\n", test_period);
printf("有效日期:%d-%02d-%02d\n", year, month, day - 1);

return 0;
}

试了一下gpt给我的答案,用C写起来确实很麻烦。估计对方的实现方式比较老了,考虑调用其他可以直接实现的库吧。
这里采用了与前一个代码不同的方式,将输入的日期的年月日拆分出来存储,并根据检测周期的值计算出对应的天数。在计算有效日期时,先根据检测周期计算年份和月份,再根据每个月份的天数计算出对应的日期。需要注意的是,这里假设每个月份的天数是固定的,因此采用了一个数组来存储。如果实际情况中存在润年等特殊情况,需要进行相应的调整。另外,在计算结果时需要将最后一天减去,才能得到正确的有效日期。
2023-05-02 00:08 来自广东 引用
0

结金体

赞同来自:

原来正邦巨亏的原因是浪c公司的程序员拖胯啊!
2023-04-30 18:34 来自广西 引用
0

水龙啊

赞同来自:

程序员的世界,看不懂
2023-04-30 17:37 来自广东 引用
1

chaoyuan

赞同来自: qianfa

c# 代码 var date = DateTime.Now.AddMonths(12).AddDays(-1);
调用现成的库比较方便
如果手动自己来实现算法,确实也需要费点劲的,理解下码农。
2023-04-30 10:05 来自浙江 引用
0

Xilana

赞同来自:

如果需求文档上明确写了
有效日期=检测日期 +检测周期(月)-1天。
首先要承认,这不是一个可加的数学公式,包括接下来那个例子并不具代表性,也就意味着,深究起来根本就无法实施。
假如今天是1月31号,1个月有效期到期日是哪天?难道非要程序员写成2月30号才是符合需求的?(虽然眼下的周期没1个月的,那6个月周期的万一赶上2月30呢)。
如果程序员完成了实施,且没有明显bug,其实他已经想到第八层了,我相信,这个问题,需求方可能都没想清楚,也可能想清楚了没说清楚。
对方技术如何,还是要看具体事儿。精密车床造的公差大,那是技术问题;火棍撅的公差大能说明什么呢
2023-04-30 09:57 来自北京 引用
0

zengyongqiang

赞同来自:

哪位大佬,告诉下我这是干嘛,有什么用,谢谢
2023-04-30 07:58 来自湖南 引用
2

zzzer

赞同来自: seancai110 ergouzizzz

这程序员培训班出师的吧
2023-04-29 23:50 来自广东 引用
0

朗朗晴天郝阳茅

赞同来自:

兄弟是开发审计软件的吧
2023-04-29 22:03 来自福建 引用
2

过冬不过冬

赞同来自: dingo49 hugo

还有一点,其实定时巡检这种事情,都不用写代码。

linux的crontab不知道比任何造的轮子好用多少倍。

直接在crontab里面调用采集脚本、采集程序采集数据然后上报就行。

crontab适用于精度要求不高,精度可以到年、月、日、小时、分钟任意搭配,配置极其简单

============================

另外纠正楼上一个认识偏差。

楼主说的是浪潮软件;AI国内的概念主要是浪潮服务器。

浪潮服务器在国内占用率还是相当不错的。

以去年中国移动的服务器集采来说:
浪潮中标金额排行第一,其次是中兴、新华三、超聚变、曙光
2023-04-29 20:05修改 来自江苏 引用
0

dingo49

赞同来自:

@yongwc
日期运算,不管是c还是java,还是Python都有现成的函数可以调用的,何必搞的那么复杂。
好的,谢谢,五一后再跟浪C的码农去PK。

跟浪C合作真是让我大跌眼镜,不断刷新下限,很多我觉得是常识的东西在他们那里仿佛都变得不可思议。。。

我发现他们只有两件事情不会,那就是:这也不会。。。那也不会。。。
但是这居然是AI板块。。。笑死人啦~~~
2023-04-29 17:24 来自四川 引用
0

zoetina52

赞同来自:

java的我会
先写个sleep指定时长比如半年
然后打印当前日期和时间
2023-04-29 17:13 来自江苏 引用
0

zhejiao

赞同来自:

@东逝水
very easy.编一个判断是否是闰年的程序不就行了!年份:能被4整除,为润年。如果年份能被100整除,此种情况下,年份必须能被400整除,为润年。举例:2024能被4整除,润年。1900能被100整除,但不能被400整除,不是润年(虽然能被4整除);2000能被100整除,也能被400整除,润年。
第二个规则到没想到,还以为只要被4整除。虽然2100年这辈子未必能看到了
2023-04-29 16:35 来自浙江 引用
0

qianfa - 波动太大顶不住

赞同来自:

c#的日期类,封装得很好,用得很爽。 大小月还有润年2月
2023-04-29 16:31 来自福建 引用
0

kk1988

赞同来自:

先想清楚一个问题,假如现在是2023年8月31日,检测有效期6个月,哪天到期?
需求逻辑模糊,才导致解决方案不精确。
2023-04-29 15:59 来自江苏 引用
1

loobai

赞同来自: dingo49

先按检测周期把月数和年数加上去,具体就是用检测周期月数整除12,把商加在年数上,余数加在月数上,如果月数超过12就往年数进1。得到日期D1。
然后检验D1,如果是4、6、9、11月的话,再检验是不是31号,是就退到30号;如果是2月份的话,再检验是不是大于等于29号,如果是再检验是不是闰年,如果是闰年就退到29号,不是闰年就退到28号。得到日期D2。判断闰年的规则,请自行百度。
然后在D2上减去一天。如果D2是1号的话,那就月数减1(如果减完后月数等于0,就要往年数退1),日数设为31,然后重复第二步的检验。

验收测试要遍历所有月份的首尾日,特别是起始日是2月29号、1月1号,起始日是8月29,30,31号且检验周期为六个月,到期日是闰年的2月27号。
2023-04-29 15:48修改 来自广东 引用
0

Xilana

赞同来自:

理论上,肯定有办法实现楼主诉求的。
但话说回来,除非像可转债到期日期,必须精确到日。像巡检,不知道定在12个月和360天,或者365天的差别在哪里,是精确计算的,365天满足3sigma法则而366天就不满足?这就像拉个灯泡线,合同上要9999 2.5方的铜线,人家偷懒用999的代替,按说也不会有什么问题,但9999可是费工夫去了,虽然我不是乙方,但做自己的事有时候也偷懒不是吗,比如做饭放盐,差不多就行,也没精确到多少水多少盐
2023-04-29 15:31 来自北京 引用
0

halhha

赞同来自:

差1天就差一天,能怎么样啊,设备一共打算用几年的?
2023-04-29 15:28 来自上海 引用
5

yongwc - 跌了买,涨了卖

赞同来自: seancai110 阴影下的猫 dingo49 夜是故乡明 newbison更多 »

日期运算,不管是c还是java,还是Python都有现成的函数可以调用的,何必搞的那么复杂。
2023-04-29 15:25 来自广东 引用
0

春秋战国

赞同来自:

闰年按平年算就好了,不需要修改,或者四年后软件都升级了,可能已经封装了日期数据。一年的检测周期提前一天到期不算错误。
楼主吹毛求疵。
2023-04-29 15:05 来自福建 引用
4

东逝水

赞同来自: boeing767 eflikai hannon zhejiao

very easy.编一个判断是否是闰年的程序不就行了!

年份:
能被4整除,为润年。
如果年份能被100整除,此种情况下,年份必须能被400整除,为润年。
举例:2024能被4整除,润年。1900能被100整除,但不能被400整除,不是润年(虽然能被4整除);2000能被100整除,也能被400整除,润年。
2023-04-29 14:42 来自江苏 引用
3

cdhr

赞同来自: seancai110 boeing767 dingo49

楼主是好心提醒我们,国内的AI板块都是乱炒作,注意风险
2023-04-29 14:37 来自四川 引用
0

jisl001

赞同来自:

1:专业的问题问专业的人。
2:为自己负责。
2023-04-29 14:28 来自浙江 引用
0

zhejiao

赞同来自:

首先判断当年是不是闰年啊(能被4整除就是啊,代码就是int(年/4)=年/4),这么简单的东西,一两行代码就解决了的
2023-04-29 14:20 来自浙江 引用
0

清风不染1

赞同来自:

我中学文化,说错了当我胡说八道,闰月它也是有规律的,用检收日期做个逻辑判断,能够判断有效期是否有闰月
2023-04-29 13:49 来自陕西 引用
6

过冬不过冬

赞同来自: seancai110 csfires hugo 青火 pppppp dingo49更多 »

1.如果时间精度不高,为啥不能用30* N来计算月份。
2.如果时间精度高,并且要跟系统时间匹配,那么调用系统时间mktime、gmtime、localtime就好了。
3.如果系统时间没联网,没法自动网络更新,只用linux内核的时间计算,精度也是够的。内置了近些年的闰年、润秒、处理,也是足够的。
4.如果是非linux内核,还不行,最后一招,clone linux内核的日期计算代码,然后烧进你的rom。

get不到难点在哪?一般1、2/3就能解决。极端没内核的用4。超出范围当我没说。

顺便说一句,大道至简,不要把问题想象那么复杂,也不要重复造轮子。
你能碰到的问题,别人早就解决了。
2023-04-29 13:47 来自江苏 引用
0

yugong1994

赞同来自:

学习
2023-04-29 13:22 来自湖南 引用
0

haitun2011

赞同来自:

就用365天不好吗?你非要纠结闰年那一天
2023-04-29 13:04 来自广东 引用
0

宿不移

赞同来自:

浪潮软件,是国有企业
2023-04-29 12:52 来自上海 引用
0

charlies

赞同来自:

如果其他语言也不难如果没有类似的函数,用字符串拼接的方式就行,最后验证拼接的出来字符串格式化成日期格式,如果转换失败,说明这个日期无效,并不存在,把字符串多减去一天就行了。
2023-04-29 12:43 来自广东 引用
2

liouzone

赞同来自: seancai110 dingo49

各个语言或数据库都有内置的 add_months这样的函数。
2023-04-29 12:37 来自江西 引用
0

waynew

赞同来自:

把闰年规则搞明白,就好了。
2023-04-29 12:26 来自天津 引用
2

charlies

赞同来自: 哈哈哈嗝 dingo49

java 也可以
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class Main {
public static void main(String[] args) {

// 假设设备的检测周期是 12 个月
int checkPeriod = 12;

// 假设今天是 2023-04-29,进行设备检测
LocalDate checkDate = LocalDate.of(2023, 4, 29);

// 计算新的有效日期
LocalDate newValidDate = validDate.plus(checkPeriod, ChronoUnit.MONTHS);

// 减去一天以得到正确的有效日期
newValidDate = newValidDate.minusDays(1);

// 输出新的有效日期
System.out.println(newValidDate.toString());
}
}
2023-04-29 12:16 来自广东 引用
1

charlies

赞同来自: dingo49

python 里可以直接加上12个月,并不会出错

下面这个代码输出结果 2024.04.28
2023-04-29 12:01修改 来自广东 引用
0

韭浪

赞同来自:

建议检测周期改为每天一次。
2023-04-29 11:26 来自江苏 引用

要回复问题请先登录注册

发起人

问题状态

  • 最新活动: 2023-12-22 12:36
  • 浏览: 14234
  • 关注: 47