js代码改写py

This commit is contained in:
fengche
2026-01-30 17:47:21 +08:00
parent a482e4ea77
commit aad77378ab
20 changed files with 2649 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
class SuccessResponse:
def __init__(self, data=None):
self.code = 0
self.msg = "Success"
if data:
self.data = data
def to_dict(self):
result = {"code": self.code, "msg": self.msg}
if hasattr(self, "data"):
result["data"] = self.data
return result
class ErrorResponse:
def __init__(self, data=None):
self.code = -1
self.msg = "Error"
if data:
self.data = data
def to_dict(self):
result = {"code": self.code, "msg": self.msg}
if hasattr(self, "data"):
result["data"] = self.data
return result
__all__ = ["SuccessResponse", "ErrorResponse"]

View File

@@ -0,0 +1,11 @@
def compute_weights(lst):
total_hashrate = sum(user["mhs24h"] for user in lst)
users_weight = [
{
"user": user["user"],
"mhs24h": user["mhs24h"],
"weight": user["mhs24h"] / total_hashrate
}
for user in lst
]
return users_weight

View File

@@ -0,0 +1,45 @@
from typing import List, Dict, Any
from decimal import Decimal, getcontext, ROUND_DOWN
getcontext().prec = 50 # 高精度,避免极端值丢失
def truncate_to_decimals_js(number: float, dots: int) -> float:
dec = Decimal(str(number))
# 转成字符串,避免科学计数法
s = format(dec, "f")
if "." not in s:
return float(s)
integer_part, frac_part = s.split(".")
truncated_frac = frac_part[:dots] # 截取小数点后 dots 位
truncated_str = f"{integer_part}.{truncated_frac}" if truncated_frac else integer_part
return float(truncated_str)
def calculate_shares_weight_js(data: List[Dict[str, Any]]) -> Dict[str, float]:
user_weights: Dict[str, Dict[str, Any]] = {}
for item in data:
user = item.get("user")
pool_diff = Decimal(str(item.get("pool_diff", 0)))
miner_diff = Decimal(str(item.get("miner_diff", 0)))
weight = Decimal("0")
if pool_diff != 0:
weight = miner_diff / pool_diff
if user not in user_weights:
user_weights[user] = {"totalWeight": Decimal("0"), "data": []}
user_weights[user]["totalWeight"] += weight
user_weights[user]["data"].append(item)
total_weight = sum(u["totalWeight"] for u in user_weights.values())
if total_weight == 0:
return {user: 0.0 for user in user_weights.keys()}
result: Dict[str, float] = {}
for user, v in user_weights.items():
ratio = v["totalWeight"] / total_weight
result[user] = truncate_to_decimals_js(float(ratio), 10)
return result
__all__ = ["calculate_shares_weight_js", "truncate_to_decimals_js"]

View File

@@ -0,0 +1,11 @@
def change_endian(hex_str: str) -> str:
# Convert hex string to bytes
buffer = bytes.fromhex(hex_str)
# Reverse the byte order
endian = buffer[::-1]
# Convert back to hex string
result = endian.hex()
return result
__all__ = ["change_endian"]

View File

@@ -0,0 +1,513 @@
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS nexa_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS nexa_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS nexa_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS grs_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS grs_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS grs_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS mona_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS mona_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS mona_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS dgbs_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbs_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbs_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS dgbq_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbq_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbq_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS dgbo_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbo_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbo_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS nexa_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
CREATE TABLE IF NOT EXISTS mona_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
CREATE TABLE IF NOT EXISTS grs_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbq_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbo_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbs_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS rxd_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS rxd_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS rxd_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS rxd_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS enx_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS enx_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS enx_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS enx_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS alph_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS alph_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS alph_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS alph_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(32,8) NOT NULL,
fees DECIMAL(32,8),
state TINYINT NOT NULL
);
CREATE TABLE IF NOT EXISTS `alph_pool_blkstats` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`date` DATETIME NOT NULL,
`height` INT(10),
`hash` VARCHAR(128),
`pow` VARCHAR(128),
`net_target` VARCHAR(128),
`submit` VARCHAR(64),
`success` TINYINT(1),
`accepts` DECIMAL(32,6),
`rejects` DECIMAL(32,6),
`reward` DECIMAL(32,6),
`fee` DECIMAL(32,6),
`nonce` VARCHAR(64),
`subidx` INT(10),
PRIMARY KEY (`id`)
);
CREATE TABLE `alph_miners` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`date` DATETIME NOT NULL,
`fromip` VARCHAR(64),
`state` VARCHAR(64),
`online` DATETIME,
`offline` DATETIME,
`retry` INT(10),
`duration` DECIMAL(12,6),
`protocol` VARCHAR(64),
`user` VARCHAR(128),
`miner` VARCHAR(128),
`refindex` VARCHAR(128),
`diff` DECIMAL(32,6),
`height` INT(10),
`accepts` DECIMAL(32,6),
`rejects` DECIMAL(32,6),
`ratio` DECIMAL(32,6),
`staleds` DECIMAL(32,6),
`lows` DECIMAL(32,6),
`duplicates` DECIMAL(32,6),
`formats` DECIMAL(32,6),
`others` DECIMAL(32,6),
`is_disabled` TINYINT(1),
`last_submit` DATETIME,
`submits` INT(10),
`blocks` INT(10),
`orphans` INT(10),
`orphan_ratio` DECIMAL(32,6),
PRIMARY KEY (`id`)
);
CREATE TABLE `alph_miners_stats` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`date` DATETIME NOT NULL,
`user` VARCHAR(128),
`miner` VARCHAR(128),
`refindex` VARCHAR(128),
`shares5m` DECIMAL(32,6),
`shares15m` DECIMAL(32,6),
`shares30m` DECIMAL(32,6),
`shares1h` DECIMAL(32,6),
`shares3h` DECIMAL(32,6),
`shares6h` DECIMAL(32,6),
`shares12h` DECIMAL(32,6),
`shares24h` DECIMAL(32,6),
`shares48h` DECIMAL(32,6),
`rejects5m` DECIMAL(32,6),
`rejects15m` DECIMAL(32,6),
`rejects30m` DECIMAL(32,6),
`rejects1h` DECIMAL(32,6),
`rejects3h` DECIMAL(32,6),
`rejects6h` DECIMAL(32,6),
`rejects12h` DECIMAL(32,6),
`rejects24h` DECIMAL(32,6),
`rejects48h` DECIMAL(32,6),
`mhs5m` DECIMAL(32,6),
`mhs15m` DECIMAL(32,6),
`mhs30m` DECIMAL(32,6),
`mhs1h` DECIMAL(32,6),
`mhs3h` DECIMAL(32,6),
`mhs6h` DECIMAL(32,6),
`mhs12h` DECIMAL(32,6),
`mhs24h` DECIMAL(32,6),
`mhs48h` DECIMAL(32,6),
`ratio5m` DECIMAL(32,6),
`ratio15m` DECIMAL(32,6),
`ratio30m` DECIMAL(32,6),
`ratio1h` DECIMAL(32,6),
`ratio3h` DECIMAL(32,6),
`ratio6h` DECIMAL(32,6),
`ratio12h` DECIMAL(32,6),
`ratio24h` DECIMAL(32,6),
`ratio48h` DECIMAL(32,6),
PRIMARY KEY (`id`)
);
CREATE TABLE `alph_blk_height_detail` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`date` DATETIME NOT NULL,
`from` INT(10),
`to` INT(10),
PRIMARY KEY (`id`)
);
CREATE TABLE `alph_blk_detail` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`date` DATETIME NOT NULL,
`height` INT(10),
`hash` VARCHAR(128),
`user` VARCHAR(128),
`miner` VARCHAR(128),
`refindex` VARCHAR(128),
`success` TINYINT(1),
`miner_diff` DECIMAL(32,6),
`pool_diff` DECIMAL(32,6),
`nonce` VARCHAR(64),
`subidx` INT(10),
PRIMARY KEY (`id`)
);
CREATE TABLE `alph_blk_new` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`date` DATETIME NOT NULL,
`height` INT(10),
`hash` VARCHAR(128),
`success` TINYINT(1),
`nonce` VARCHAR(64),
`subidx` INT(10),
PRIMARY KEY (`id`)
);

View File

@@ -0,0 +1,22 @@
import asyncio
import sys
async def execute_with_retry(task, max_retries, delay):
attempts = 0
while attempts < max_retries:
try:
return await task()
except Exception as error:
attempts += 1
print(f"尝试 {attempts} 失败: {error}", file=sys.stderr)
if attempts >= max_retries:
print("已达最大重试次数,任务失败。", file=sys.stderr)
raise
print(f"等待 {delay} 秒后重试...")
await asyncio.sleep(delay)
__all__ = ["execute_with_retry"]

View File

@@ -0,0 +1,35 @@
def caculate_standar_deviation(data):
def calculate_mean(values):
total = sum(float(value) for value in values)
return total / len(values)
def calculate_standard_deviation(values, mean):
variance = sum((float(value) - mean) ** 2 for value in values) / len(values)
return variance ** 0.5
results = {}
for user in data:
values = data[user]
mean = calculate_mean(values)
stddev = calculate_standard_deviation(values, mean)
results[user] = stddev
return results
def score(alluser_mhs24h, hash_percent=1):
hashrate_values = [obj["mhs24h"] for obj in alluser_mhs24h]
total_hashrate = sum(hashrate_values)
result = {}
for item in alluser_mhs24h:
user = item["user"]
mhs24h = item["mhs24h"]
result[user] = (mhs24h / total_hashrate) * hash_percent
return result
__all__ = ["caculate_standar_deviation", "score"]

View File

@@ -0,0 +1,66 @@
from datetime import datetime, timezone, timedelta
from email.utils import parsedate_to_datetime
class Times:
@staticmethod
def _js_date_parse(date_form: str) -> datetime:
if date_form == "":
raise ValueError("Invalid Date")
try:
if date_form.endswith("Z"):
return datetime.fromisoformat(date_form.replace("Z", "+00:00"))
return datetime.fromisoformat(date_form)
except Exception:
pass
try:
return datetime.strptime(date_form, "%Y-%m-%d %H:%M:%S")
except Exception:
pass
try:
return datetime.strptime(date_form, "%Y/%m/%d %H:%M:%S")
except Exception:
pass
try:
return parsedate_to_datetime(date_form)
except Exception:
pass
raise ValueError("Invalid Date")
@staticmethod
def bj_time(date_form: str) -> str:
if date_form == "":
return ""
dt = Times._js_date_parse(date_form)
if dt.tzinfo is None:
dt = dt.replace(tzinfo=timezone.utc)
bj_dt = dt + timedelta(hours=8)
return bj_dt.strftime("%Y-%m-%d %H:%M:%S")
@staticmethod
def utc_time(date_form: str) -> str:
if date_form == "":
return ""
dt = Times._js_date_parse(date_form)
if dt.tzinfo is None:
dt = dt.replace(tzinfo=timezone.utc)
utc_dt = dt.astimezone(timezone.utc)
return utc_dt.strftime("%Y-%m-%d %H:%M:%S")
@staticmethod
def times():
now = datetime.now()
y = now.strftime("%Y")
M = now.strftime("%m")
d = now.strftime("%d")
h = now.strftime("%H")
m = now.strftime("%M")
s = now.strftime("%S")
return [
f"{y}-{M}-{d} {h}:{m}",
f"{y}-{M}-{d} {h}:{m}:{s}",
f"{y}-{M}-{d}",
f"{m}",
f"{h}",
f"{d}",
]