āĻšā§āĻ¯āĻžāĻ˛ā§ āĻšā§āĻ¯āĻžāĻŦā§āĻ°āĻžāĻ¸āĻžāĻ°ā§āĻ¸āĨ¤ āĻāĻ āĻāĻŽāĻŋ āĻāĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻā§āĻ° āĻ¸āĻšāĻ NTP āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻāĻŋāĻāĻžāĻŦā§ āĻ˛āĻŋāĻāĻ¤ā§ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻĨāĻž āĻŦāĻ˛āĻ¤ā§ āĻāĻžāĻ. āĻŽā§āĻ˛āĻ¤, āĻāĻĨā§āĻĒāĻāĻĨāĻ¨āĻāĻŋ āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° āĻāĻ āĻ¨ āĻāĻŦāĻ NTP āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻĨā§āĻā§ āĻā§āĻāĻžāĻŦā§ āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻ¤āĻžāĻ° āĻĻāĻŋāĻā§ āĻĢāĻŋāĻ°ā§ āĻ¯āĻžāĻŦā§āĨ¤ āĻā§āĻĄāĻāĻŋ āĻĒāĻžāĻāĻĨāĻ¨ā§ āĻ˛ā§āĻāĻž āĻšāĻŦā§, āĻāĻžāĻ°āĻŖ, āĻāĻŽāĻžāĻ° āĻŽāĻ¤ā§, āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻāĻŋāĻ¨āĻŋāĻ¸ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻ° āĻā§āĻ¨ āĻāĻžāĻ˛ā§ āĻāĻžāĻˇāĻž āĻ¨ā§āĻāĨ¤ Connoisseurs ntplib āĻā§āĻĄā§āĻ° āĻ¸āĻžāĻĨā§ āĻā§āĻĄā§āĻ° āĻŽāĻŋāĻ˛ā§āĻ° āĻĻāĻŋāĻā§ āĻŽāĻ¨ā§āĻ¯ā§āĻ āĻĻā§āĻŦā§āĻ¨ - āĻāĻŽāĻŋ āĻāĻāĻŋ āĻĻā§āĻŦāĻžāĻ°āĻž "āĻ
āĻ¨ā§āĻĒā§āĻ°āĻžāĻŖāĻŋāĻ¤" āĻšāĻ¯āĻŧā§āĻāĻŋāĨ¤
āĻ¤āĻžāĻ NTP āĻāĻŋ āĻ¯āĻžāĻāĻšā§āĻ? NTP āĻšāĻ˛ āĻ¸āĻŽāĻ¯āĻŧ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¯ā§āĻāĻžāĻ¯ā§āĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛āĨ¤ āĻāĻ āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻ
āĻ¨ā§āĻ āĻāĻ§ā§āĻ¨āĻŋāĻ āĻŽā§āĻļāĻŋāĻ¨ā§ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻāĻ¨ā§āĻĄā§āĻā§āĻ° w32tm āĻĒāĻ°āĻŋāĻˇā§āĻŦāĻžāĨ¤
NTP āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ā§āĻ° āĻŽā§āĻ 5 āĻāĻŋ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ āĻ°āĻ¯āĻŧā§āĻā§āĨ¤ āĻĒā§āĻ°āĻĨāĻŽ, āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ 0 (1985, RFC958) āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§ āĻ āĻĒā§āĻ°āĻāĻ˛āĻŋāĻ¤ āĻŦāĻ˛ā§ āĻŦāĻŋāĻŦā§āĻāĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻ¨āĻ¤ā§āĻ¨āĻā§āĻ˛āĻŋ āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧ, 1āĻŽ (1988, RFC1059), 2āĻ¯āĻŧ (1989, RFC1119), 3āĻ¯āĻŧ (1992, RFC1305) āĻāĻŦāĻ āĻāĻ¤ā§āĻ°ā§āĻĨ (4, RFC1996)āĨ¤ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ 2030-1 āĻāĻā§ āĻ āĻĒāĻ°ā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻžāĻŽāĻā§āĻāĻ¸ā§āĻ¯āĻĒā§āĻ°ā§āĻŖ, āĻ¤āĻžāĻ°āĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§āĻ° āĻ ā§āĻ¯āĻžāĻ˛āĻāĻ°āĻŋāĻĻāĻŽā§ āĻāĻŋāĻ¨ā§āĻ¨āĨ¤
āĻĒā§āĻ¯āĻžāĻā§āĻ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸
āĻ˛āĻŋāĻĒ āĻ¸ā§āĻāĻ (āĻ¸āĻāĻļā§āĻ§āĻ¨ āĻ¸ā§āĻāĻ) āĻāĻŽāĻ¨ āĻāĻāĻāĻŋ āĻ¸āĻāĻā§āĻ¯āĻž āĻ¯āĻž āĻ˛āĻŋāĻĒ āĻ¸ā§āĻā§āĻ¨ā§āĻĄ āĻ¸āĻ¤āĻ°ā§āĻāĻ¤āĻž āĻ¨āĻŋāĻ°ā§āĻĻā§āĻļ āĻāĻ°ā§āĨ¤ āĻ
āĻ°ā§āĻĨ:
- 0 - āĻā§āĻ¨ āĻ¸āĻāĻļā§āĻ§āĻ¨ āĻ¨ā§āĻ
- 1 - āĻĻāĻŋāĻ¨ā§āĻ° āĻļā§āĻˇ āĻŽāĻŋāĻ¨āĻŋāĻā§ 61 āĻ¸ā§āĻā§āĻ¨ā§āĻĄ āĻĨāĻžāĻā§
- 2 - āĻĻāĻŋāĻ¨ā§āĻ° āĻļā§āĻˇ āĻŽāĻŋāĻ¨āĻŋāĻā§ 59 āĻ¸ā§āĻā§āĻ¨ā§āĻĄ āĻĨāĻžāĻā§
- 3 - āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻŦā§āĻ¯āĻ°ā§āĻĨāĻ¤āĻž (āĻ¸āĻŋāĻā§āĻā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻļā§āĻˇ)
āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ āĻ¨āĻŽā§āĻŦāĻ° (āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ āĻ¨āĻŽā§āĻŦāĻ°) â NTP āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ āĻ¨āĻŽā§āĻŦāĻ° (1-4)āĨ¤
āĻŽā§āĻĄ (āĻŽā§āĻĄ) â āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒā§āĻ°ā§āĻ°āĻā§āĻ° āĻ āĻĒāĻžāĻ°ā§āĻļāĻ¨ āĻŽā§āĻĄāĨ¤ āĻŽāĻžāĻ¨ 0 āĻĨā§āĻā§ 7, āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ:
- 3 - āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ
- 4 - āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°
- 5 - āĻ¸āĻŽā§āĻĒā§āĻ°āĻāĻžāĻ° āĻŽā§āĻĄ
āĻ¸ā§āĻā§āĻ°ā§āĻāĻžāĻŽ (āĻ˛ā§āĻ¯āĻŧāĻžāĻ°āĻŋāĻ āĻ˛ā§āĻā§āĻ˛) - āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻāĻŦāĻ āĻ°ā§āĻĢāĻžāĻ°ā§āĻ¨ā§āĻ¸ āĻāĻĄāĻŧāĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻŽāĻ§ā§āĻ¯āĻŦāĻ°ā§āĻ¤ā§ āĻ¸ā§āĻ¤āĻ°ā§āĻ° āĻ¸āĻāĻā§āĻ¯āĻž (1 - āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ°ā§āĻĢāĻžāĻ°ā§āĻ¨ā§āĻ¸ āĻāĻĄāĻŧāĻŋ āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻ¨ā§āĻ¯āĻŧ, 2 - āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°āĻāĻŋ āĻ¸ā§āĻ¤āĻ° 1 āĻ¸āĻš āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻ¨ā§āĻ¯āĻŧ, āĻāĻ¤ā§āĻ¯āĻžāĻĻāĻŋ)āĨ¤
āĻĒā§āĻ˛ āĻā§āĻ°āĻŽāĻžāĻāĻ¤ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻ¸āĻ°ā§āĻŦāĻžāĻ§āĻŋāĻ āĻŦā§āĻ¯āĻŦāĻ§āĻžāĻ¨ā§āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻ¨āĻŋāĻ§āĻŋāĻ¤ā§āĻŦāĻāĻžāĻ°ā§ āĻāĻāĻāĻŋ āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ°āĻŋāĻ¤ āĻĒā§āĻ°ā§āĻŖāĻ¸āĻāĻā§āĻ¯āĻžāĨ¤ NTP āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻāĻāĻžāĻ¨ā§ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻ°ā§ āĻ¯ā§ āĻŦā§āĻ¯āĻŦāĻ§āĻžāĻ¨ā§ āĻāĻāĻŋ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§ āĻĒā§āĻ˛ āĻāĻ°āĻžāĻ° āĻāĻļāĻž āĻāĻ°ā§, āĻāĻŦāĻ NTP āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻ¸ā§āĻ āĻŦāĻŋāĻ°āĻ¤āĻŋāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻ°ā§ āĻ¯ā§āĻāĻžāĻ¨ā§ āĻāĻāĻŋ āĻĒā§āĻ˛ āĻšāĻāĻ¯āĻŧāĻžāĻ° āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻļāĻž āĻāĻ°ā§āĨ¤ āĻŽāĻžāĻ¨āĻāĻŋ āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻŦāĻžāĻāĻ¨āĻžāĻ°āĻŋ āĻ˛āĻāĻžāĻ°āĻŋāĻĻāĻŽā§āĻ° āĻ¸āĻŽāĻžāĻ¨āĨ¤
āĻ¸ā§āĻĒāĻˇā§āĻāĻ¤āĻž (āĻ¨āĻŋāĻ°ā§āĻā§āĻ˛āĻ¤āĻž) āĻšāĻ˛ āĻāĻāĻāĻŋ āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ°āĻŋāĻ¤ āĻĒā§āĻ°ā§āĻŖāĻ¸āĻāĻā§āĻ¯āĻž āĻ¯āĻž āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻāĻĄāĻŧāĻŋāĻ° āĻ¨āĻŋāĻ°ā§āĻā§āĻ˛āĻ¤āĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻ¨āĻŋāĻ§āĻŋāĻ¤ā§āĻŦ āĻāĻ°ā§āĨ¤ āĻŽāĻžāĻ¨āĻāĻŋ āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻŦāĻžāĻāĻ¨āĻžāĻ°āĻŋ āĻ˛āĻāĻžāĻ°āĻŋāĻĻāĻŽā§āĻ° āĻ¸āĻŽāĻžāĻ¨āĨ¤
āĻŽā§āĻ˛ āĻŦāĻŋāĻ˛āĻŽā§āĻŦ (āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻ˛ā§āĻā§āĻ¨ā§āĻ¸āĻŋ) āĻšāĻ˛ āĻāĻ¨āĻāĻŋāĻĒāĻŋ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§ āĻĒā§āĻāĻāĻ¤ā§ āĻāĻĄāĻŧāĻŋāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ˛āĻžāĻā§, āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ-āĻŦāĻŋāĻ¨ā§āĻĻā§ āĻ¸āĻāĻā§āĻ¯āĻž āĻšāĻŋāĻ¸āĻžāĻŦā§āĨ¤
āĻŽā§āĻ˛ āĻŦāĻŋāĻā§āĻā§āĻ°āĻŖ (āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻžāĻ°) - āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ-āĻŦāĻŋāĻ¨ā§āĻĻā§ āĻ¸āĻāĻā§āĻ¯āĻž āĻšāĻŋāĻ¸āĻžāĻŦā§ NTP āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻāĻĄāĻŧāĻŋāĻ° āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻžāĻ°āĨ¤
āĻ°ā§āĻĢ āĻāĻāĻĄāĻŋ (āĻ¸ā§āĻ°ā§āĻ¸ āĻāĻāĻĄāĻŋ) â āĻāĻ¯āĻŧāĻžāĻ āĻāĻāĻĄāĻŋāĨ¤ āĻ¯āĻĻāĻŋ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§ āĻ¸ā§āĻā§āĻ°ā§āĻ¯āĻžāĻāĻžāĻŽ 1 āĻĨāĻžāĻā§, āĻ¤āĻžāĻšāĻ˛ā§ āĻ°ā§āĻĢ āĻāĻāĻĄāĻŋ āĻšāĻ˛ āĻĒāĻžāĻ°āĻŽāĻžāĻŖāĻŦāĻŋāĻ āĻāĻĄāĻŧāĻŋāĻ° āĻ¨āĻžāĻŽ (4 ASCII āĻ
āĻā§āĻˇāĻ°)āĨ¤ āĻ¯āĻĻāĻŋ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻ
āĻ¨ā§āĻ¯ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§, āĻ¤āĻžāĻšāĻ˛ā§ āĻ°ā§āĻĢ āĻāĻāĻĄāĻŋāĻ¤ā§ āĻāĻ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§āĻ° āĻ āĻŋāĻāĻžāĻ¨āĻž āĻĨāĻžāĻā§āĨ¤
āĻļā§āĻˇ 4āĻāĻŋ āĻā§āĻˇā§āĻ¤ā§āĻ° āĻšāĻ˛ āĻ¸āĻŽāĻ¯āĻŧ - 32 āĻŦāĻŋāĻ - āĻĒā§āĻ°ā§āĻŖāĻ¸āĻāĻā§āĻ¯āĻž āĻ
āĻāĻļ, 32 āĻŦāĻŋāĻ - āĻāĻā§āĻ¨āĻžāĻāĻļ āĻ
āĻāĻļāĨ¤
āĻāĻ˛ā§āĻ˛ā§āĻ - āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§ āĻ¸āĻ°ā§āĻŦāĻļā§āĻˇ āĻāĻĄāĻŧāĻŋāĨ¤
āĻā§āĻĒāĻ¤ā§āĻ¤āĻŋ - āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāĻ¨ā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ (āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°ā§āĻŖ - āĻ¨ā§āĻā§ āĻāĻāĻŋ āĻāĻ°āĻ)āĨ¤
āĻ¨āĻŋāĻ¨ - āĻ¯āĻāĻ¨ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻā§āĻšā§āĻ¤ āĻšāĻ¯āĻŧ.
āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž - āĻ¯āĻāĻ¨ āĻĒā§āĻ¯āĻžāĻā§āĻāĻāĻŋ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻĨā§āĻā§ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻā§āĻ° āĻāĻžāĻā§ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛ (āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻ°āĻžāĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛, āĻ¨ā§āĻā§ āĻāĻ°āĻ āĻāĻŋāĻā§)āĨ¤
āĻļā§āĻˇ āĻĻā§āĻāĻŋ āĻā§āĻˇā§āĻ¤ā§āĻ° āĻŦāĻŋāĻŦā§āĻāĻ¨āĻž āĻāĻ°āĻž āĻšāĻŦā§ āĻ¨āĻž.
āĻāĻŽāĻžāĻĻā§āĻ° āĻĒā§āĻ¯āĻžāĻā§āĻ āĻ˛āĻŋāĻā§āĻ¨:
āĻĒā§āĻ¯āĻžāĻā§āĻ āĻā§āĻĄ
class NTPPacket:
_FORMAT = "!B B b b 11I"
def __init__(self, version_number=2, mode=3, transmit=0):
# Necessary of enter leap second (2 bits)
self.leap_indicator = 0
# Version of protocol (3 bits)
self.version_number = version_number
# Mode of sender (3 bits)
self.mode = mode
# The level of "layering" reading time (1 byte)
self.stratum = 0
# Interval between requests (1 byte)
self.pool = 0
# Precision (log2) (1 byte)
self.precision = 0
# Interval for the clock reach NTP server (4 bytes)
self.root_delay = 0
# Scatter the clock NTP-server (4 bytes)
self.root_dispersion = 0
# Indicator of clocks (4 bytes)
self.ref_id = 0
# Last update time on server (8 bytes)
self.reference = 0
# Time of sending packet from local machine (8 bytes)
self.originate = 0
# Time of receipt on server (8 bytes)
self.receive = 0
# Time of sending answer from server (8 bytes)
self.transmit = transmit
āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§ āĻāĻāĻāĻŋ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāĻ¤ā§ (āĻāĻŦāĻ āĻā§āĻ°āĻšāĻŖ āĻāĻ°āĻ¤ā§), āĻāĻŽāĻžāĻĻā§āĻ° āĻ
āĻŦāĻļā§āĻ¯āĻ āĻāĻāĻŋāĻā§ āĻŦāĻžāĻāĻā§āĻ° āĻ
ā§āĻ¯āĻžāĻ°ā§āĻ¤ā§ āĻĒāĻ°āĻŋāĻŖāĻ¤ āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻ¤ā§ āĻšāĻŦā§āĨ¤
āĻāĻ (āĻāĻŦāĻ āĻŦāĻŋāĻĒāĻ°ā§āĻ¤) āĻ
āĻĒāĻžāĻ°ā§āĻļāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŽāĻ°āĻž āĻĻā§āĻāĻŋ āĻĢāĻžāĻāĻļāĻ¨ āĻ˛āĻŋāĻāĻŦ - pack() āĻāĻŦāĻ unpack():
āĻĒā§āĻ¯āĻžāĻ āĻĢāĻžāĻāĻļāĻ¨
def pack(self):
return struct.pack(NTPPacket._FORMAT,
(self.leap_indicator << 6) +
(self.version_number << 3) + self.mode,
self.stratum,
self.pool,
self.precision,
int(self.root_delay) + get_fraction(self.root_delay, 16),
int(self.root_dispersion) +
get_fraction(self.root_dispersion, 16),
self.ref_id,
int(self.reference),
get_fraction(self.reference, 32),
int(self.originate),
get_fraction(self.originate, 32),
int(self.receive),
get_fraction(self.receive, 32),
int(self.transmit),
get_fraction(self.transmit, 32))
āĻāĻ¨āĻĒā§āĻ¯āĻžāĻ āĻĢāĻžāĻāĻļāĻ¨
def unpack(self, data: bytes):
unpacked_data = struct.unpack(NTPPacket._FORMAT, data)
self.leap_indicator = unpacked_data[0] >> 6 # 2 bits
self.version_number = unpacked_data[0] >> 3 & 0b111 # 3 bits
self.mode = unpacked_data[0] & 0b111 # 3 bits
self.stratum = unpacked_data[1] # 1 byte
self.pool = unpacked_data[2] # 1 byte
self.precision = unpacked_data[3] # 1 byte
# 2 bytes | 2 bytes
self.root_delay = (unpacked_data[4] >> 16) +
(unpacked_data[4] & 0xFFFF) / 2 ** 16
# 2 bytes | 2 bytes
self.root_dispersion = (unpacked_data[5] >> 16) +
(unpacked_data[5] & 0xFFFF) / 2 ** 16
# 4 bytes
self.ref_id = str((unpacked_data[6] >> 24) & 0xFF) + " " +
str((unpacked_data[6] >> 16) & 0xFF) + " " +
str((unpacked_data[6] >> 8) & 0xFF) + " " +
str(unpacked_data[6] & 0xFF)
self.reference = unpacked_data[7] + unpacked_data[8] / 2 ** 32 # 8 bytes
self.originate = unpacked_data[9] + unpacked_data[10] / 2 ** 32 # 8 bytes
self.receive = unpacked_data[11] + unpacked_data[12] / 2 ** 32 # 8 bytes
self.transmit = unpacked_data[13] + unpacked_data[14] / 2 ** 32 # 8 bytes
return self
āĻ āĻ˛āĻ¸ āĻ˛ā§āĻā§āĻĻā§āĻ° āĻāĻ¨ā§āĻ¯, āĻāĻāĻāĻŋ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻšāĻŋāĻ¸āĻžāĻŦā§ - āĻā§āĻĄ āĻ¯āĻž āĻĒā§āĻ¯āĻžāĻā§āĻāĻāĻŋāĻā§ āĻāĻāĻāĻŋ āĻ¸ā§āĻ¨ā§āĻĻāĻ° āĻ¸ā§āĻā§āĻ°āĻŋāĻāĻ¯āĻŧā§ āĻĒāĻ°āĻŋāĻŖāĻ¤ āĻāĻ°ā§
def to_display(self):
return "Leap indicator: {0.leap_indicator}n"
"Version number: {0.version_number}n"
"Mode: {0.mode}n"
"Stratum: {0.stratum}n"
"Pool: {0.pool}n"
"Precision: {0.precision}n"
"Root delay: {0.root_delay}n"
"Root dispersion: {0.root_dispersion}n"
"Ref id: {0.ref_id}n"
"Reference: {0.reference}n"
"Originate: {0.originate}n"
"Receive: {0.receive}n"
"Transmit: {0.transmit}"
.format(self)
āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§ āĻāĻāĻāĻŋ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻšāĻā§āĻā§
āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§ āĻāĻ°āĻž āĻā§āĻˇā§āĻ¤ā§āĻ° āĻ¸āĻš āĻāĻāĻāĻŋ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāĻ¨ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ, āĻŽā§āĻĄ и āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻžāĨ¤ āĻĻā§āĻ¯ āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž āĻāĻĒāĻ¨āĻžāĻā§ āĻ āĻŦāĻļā§āĻ¯āĻ āĻ¸ā§āĻĨāĻžāĻ¨ā§āĻ¯āĻŧ āĻŽā§āĻļāĻŋāĻ¨ā§ āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻ¸āĻŽāĻ¯āĻŧ āĻāĻ˛ā§āĻ˛ā§āĻ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ (āĻāĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ°āĻŋ 1, 1900 āĻĨā§āĻā§ āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻ¸āĻāĻā§āĻ¯āĻž), āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ - 1-4, āĻŽā§āĻĄ - 3 (āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻŽā§āĻĄ)āĨ¤
āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°, āĻ āĻ¨ā§āĻ°ā§āĻ§ āĻĒāĻžāĻāĻ¯āĻŧāĻžāĻ° āĻĒāĻ°ā§, NTP āĻĒā§āĻ¯āĻžāĻā§āĻā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻā§āĻˇā§āĻ¤ā§āĻ° āĻĒā§āĻ°āĻŖ āĻāĻ°ā§, āĻā§āĻˇā§āĻ¤ā§āĻ°ā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻ āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋ āĻāĻ°ā§ āĻā§āĻĒāĻ¤ā§āĻ¤āĻŋ āĻĨā§āĻā§ āĻŽāĻžāĻ¨ āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž, āĻ¯āĻž āĻ āĻ¨ā§āĻ°ā§āĻ§ āĻāĻ¸ā§āĻāĻŋāĻ˛. āĻā§āĻ¨ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻ āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻ¤āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧā§āĻ° āĻŽā§āĻ˛ā§āĻ¯ āĻĒā§āĻ°āĻŖ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻ¨āĻž āĻāĻāĻž āĻāĻŽāĻžāĻ° āĻāĻžāĻā§ āĻāĻāĻāĻŋ āĻ°āĻšāĻ¸ā§āĻ¯ āĻā§āĻĒāĻ¤ā§āĻ¤āĻŋ. āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻ¯āĻāĻ¨ āĻĒā§āĻ¯āĻžāĻā§āĻāĻāĻŋ āĻĢāĻŋāĻ°ā§ āĻāĻ¸ā§, āĻ¤āĻāĻ¨ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻā§āĻ° 4āĻāĻŋ āĻ¸āĻŽāĻ¯āĻŧā§āĻ° āĻŽāĻžāĻ¨ āĻĨāĻžāĻā§ - āĻ āĻ¨ā§āĻ°ā§āĻ§āĻāĻŋ āĻĒāĻžāĻ āĻžāĻ¨ā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ (āĻā§āĻĒāĻ¤ā§āĻ¤āĻŋ), āĻ¯ā§ āĻ¸āĻŽāĻ¯āĻŧ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻ āĻ¨ā§āĻ°ā§āĻ§ āĻĒā§āĻ¯āĻŧā§āĻāĻŋāĻ˛ (āĻ¨āĻŋāĻ¨), āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒāĻžāĻ āĻžāĻ¨ā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ (āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž) āĻāĻŦāĻ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻ¸āĻŽāĻ¯āĻŧ - āĻĒā§āĻāĻāĻž (āĻĒā§āĻ¯āĻžāĻā§āĻā§ āĻ¨ā§āĻ)āĨ¤ āĻāĻ āĻŽāĻžāĻ¨ āĻĻāĻŋāĻ¯āĻŧā§ āĻāĻŽāĻ°āĻž āĻ¸āĻ āĻŋāĻ āĻ¸āĻŽāĻ¯āĻŧ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŋāĨ¤
āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻāĻŦāĻ āĻā§āĻĄ āĻā§āĻ°āĻšāĻŖ
# Time difference between 1970 and 1900, seconds
FORMAT_DIFF = (datetime.date(1970, 1, 1) - datetime.date(1900, 1, 1)).days * 24 * 3600
# Waiting time for recv (seconds)
WAITING_TIME = 5
server = "pool.ntp.org"
port = 123
packet = NTPPacket(version_number=2, mode=3, transmit=time.time() + FORMAT_DIFF)
answer = NTPPacket()
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.settimeout(WAITING_TIME)
s.sendto(packet.pack(), (server, port))
data = s.recv(48)
arrive_time = time.time() + FORMAT_DIFF
answer.unpack(data)
āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻĒā§āĻ°āĻ¸ā§āĻ¸āĻŋāĻ
āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ°āĻŖāĻāĻŋ āĻ°ā§āĻŽāĻ¨ā§āĻĄ āĻāĻŽ. āĻ¸ā§āĻŽāĻ˛āĻŋāĻ¯āĻŧāĻžāĻ¨ (1978) āĻāĻ° āĻĒā§āĻ°āĻžāĻ¨ā§ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻĨā§āĻā§ āĻāĻāĻ°ā§āĻ āĻāĻĻā§āĻ°āĻ˛ā§āĻā§āĻ° āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ˛āĻžāĻĒā§āĻ° āĻ āĻ¨ā§āĻ°ā§āĻĒ: âāĻāĻ āĻŦā§āĻ¯āĻā§āĻ¤āĻŋāĻ° āĻšāĻžāĻ¤ā§ āĻāĻĄāĻŧāĻŋ āĻāĻŋāĻ˛ āĻ¨āĻž, āĻ¤āĻŦā§ āĻŦāĻžāĻĄāĻŧāĻŋāĻ¤ā§ āĻāĻāĻāĻŋ āĻ¸āĻ āĻŋāĻ āĻĒā§āĻ°āĻžāĻā§āĻ° āĻāĻĄāĻŧāĻŋ āĻāĻŋāĻ˛, āĻ¯āĻž āĻ¤āĻŋāĻ¨āĻŋ āĻŽāĻžāĻā§ āĻŽāĻžāĻā§ āĻŦāĻžāĻ¤āĻžāĻ¸ āĻāĻ°āĻ¤ā§ āĻā§āĻ˛ā§ āĻ¯āĻžāĻāĨ¤ āĻāĻāĻĻāĻŋāĻ¨, āĻāĻŦāĻžāĻ° āĻāĻĄāĻŧāĻŋ āĻāĻžāĻ˛ā§ āĻāĻ°āĻ¤ā§ āĻā§āĻ˛ā§ āĻāĻŋāĻ¯āĻŧā§, āĻ¸ā§ āĻ¤āĻžāĻ° āĻŦāĻ¨ā§āĻ§ā§āĻ° āĻ¸āĻžāĻĨā§ āĻĻā§āĻāĻž āĻāĻ°āĻ¤ā§ āĻāĻŋāĻ¯āĻŧā§āĻāĻŋāĻ˛, āĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻ¨ā§āĻ§ā§āĻ¯āĻž āĻāĻžāĻāĻŋāĻ¯āĻŧā§āĻāĻŋāĻ˛, āĻāĻŦāĻ āĻ¯āĻāĻ¨ āĻ¸ā§ āĻŦāĻžāĻĄāĻŧāĻŋ āĻĢāĻŋāĻ°ā§āĻāĻŋāĻ˛, āĻ¸ā§ āĻāĻĄāĻŧāĻŋāĻāĻŋ āĻ¸āĻ āĻŋāĻāĻāĻžāĻŦā§ āĻ¸ā§āĻ āĻāĻ°āĻ¤ā§ āĻĒā§āĻ°ā§āĻāĻŋāĻ˛āĨ¤ āĻā§āĻ°āĻŽāĻŖā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻā§ āĻĨā§āĻā§ āĻāĻžāĻ¨āĻž āĻ¨āĻž āĻĨāĻžāĻāĻ˛ā§ āĻ¤āĻŋāĻ¨āĻŋ āĻā§āĻāĻžāĻŦā§ āĻāĻāĻŋ āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻ¨āĻž āĻāĻ°ā§āĻāĻŋāĻ˛ā§āĻ¨? āĻāĻ¤ā§āĻ¤āĻ°āĻāĻŋ āĻšāĻ˛: "āĻāĻ° āĻā§āĻĄāĻŧā§, āĻāĻāĻāĻ¨ āĻŦā§āĻ¯āĻā§āĻ¤āĻŋ āĻāĻĄāĻŧāĻŋāĻ° āĻāĻžāĻāĻāĻž āĻŦāĻ¨ā§āĻ§ āĻāĻ°ā§ āĻāĻŦāĻ āĻšāĻžāĻ¤ā§āĻ° āĻ āĻŦāĻ¸ā§āĻĨāĻžāĻ¨ āĻŽāĻ¨ā§ āĻ°āĻžāĻā§āĨ¤ āĻŦāĻ¨ā§āĻ§ā§āĻ° āĻāĻžāĻā§ āĻāĻ¸āĻž āĻāĻŦāĻ āĻ āĻ¤āĻŋāĻĨāĻŋāĻĻā§āĻ° āĻŦāĻŋāĻĻāĻžāĻ¯āĻŧā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¤āĻŋāĻ¨āĻŋ āĻ¤āĻžāĻ° āĻāĻāĻŽāĻ¨ āĻāĻŦāĻ āĻĒā§āĻ°āĻ¸ā§āĻĨāĻžāĻ¨ā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¨ā§āĻ āĻāĻ°ā§āĻ¨āĨ¤ āĻāĻāĻŋ āĻ¤āĻžāĻā§ āĻā§āĻāĻā§ āĻŦā§āĻ° āĻāĻ°āĻ¤ā§ āĻĻā§āĻ¯āĻŧ āĻ¯ā§ āĻ¸ā§ āĻāĻ¤āĻā§āĻˇāĻŖ āĻĻā§āĻ°ā§ āĻāĻŋāĻ˛āĨ¤ āĻŦāĻžāĻĄāĻŧāĻŋāĻ¤ā§ āĻĢāĻŋāĻ°ā§ āĻāĻŦāĻ āĻāĻĄāĻŧāĻŋāĻ° āĻĻāĻŋāĻā§ āĻ¤āĻžāĻāĻŋāĻ¯āĻŧā§ āĻāĻāĻāĻ¨ āĻŦā§āĻ¯āĻā§āĻ¤āĻŋ āĻ¤āĻžāĻ° āĻ āĻ¨ā§āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ° āĻ¸āĻŽāĻ¯āĻŧāĻāĻžāĻ˛ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻāĻ°ā§āĨ¤ āĻāĻ āĻ¸āĻŽāĻ¯āĻŧ āĻĨā§āĻā§ āĻŦāĻŋāĻ¯āĻŧā§āĻ āĻāĻ°ā§ āĻ¤āĻŋāĻ¨āĻŋ āĻ¯ā§ āĻ¸āĻŽāĻ¯āĻŧāĻāĻž āĻĻā§āĻāĻ¤ā§ āĻāĻŋāĻ¯āĻŧā§āĻāĻŋāĻ˛ā§āĻ¨, āĻ¸ā§āĻ āĻŦā§āĻ¯āĻā§āĻ¤āĻŋ āĻ¸ā§āĻāĻžāĻ¨ā§ āĻāĻŦāĻ āĻĒāĻŋāĻāĻ¨ā§āĻ° āĻ°āĻžāĻ¸ā§āĻ¤āĻžāĻ¯āĻŧ āĻāĻžāĻāĻžāĻ¨ā§ āĻ¸āĻŽāĻ¯āĻŧ āĻā§āĻāĻā§ āĻŦā§āĻ° āĻāĻ°ā§āĨ¤ āĻ āĻ¤āĻŋāĻĨāĻŋāĻĻā§āĻ° āĻŦāĻŋāĻĻāĻžāĻ¯āĻŧā§āĻ° āĻ¸āĻŽāĻ¯āĻŧā§āĻ° āĻ¸āĻžāĻĨā§ āĻ°āĻžāĻ¸ā§āĻ¤āĻžāĻ¯āĻŧ āĻŦā§āĻ¯āĻ¯āĻŧ āĻāĻ°āĻž āĻ āĻ°ā§āĻ§ā§āĻ āĻ¸āĻŽāĻ¯āĻŧ āĻ¯ā§āĻ āĻāĻ°ā§ āĻ¤āĻŋāĻ¨āĻŋ āĻŦāĻžāĻĄāĻŧāĻŋāĻ¤ā§ āĻāĻ¸āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻā§āĻāĻā§ āĻŦā§āĻ° āĻāĻ°āĻžāĻ° āĻāĻŦāĻ āĻ¸ā§āĻ āĻ āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§ āĻ¤āĻžāĻ° āĻāĻĄāĻŧāĻŋāĻ° āĻšāĻžāĻ¤ āĻ¸āĻžāĻŽāĻā§āĻāĻ¸ā§āĻ¯ āĻāĻ°āĻžāĻ° āĻ¸ā§āĻ¯ā§āĻ āĻĒāĻžāĻ¨āĨ¤
āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻ āĻ¨ā§āĻ°ā§āĻ§ā§ āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻā§āĻāĻā§āĻ¨:
- āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻĨā§āĻā§ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻā§āĻ°āĻŽāĻŖā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻā§āĻāĻāĻž: ((āĻāĻāĻŽāĻ¨ - āĻā§āĻĒāĻ¤ā§āĻ¤āĻŋ) - (āĻā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻ - āĻ°āĻŋāĻ¸āĻŋāĻ)) / 2
- āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻāĻŦāĻ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻĒāĻžāĻ°ā§āĻĨāĻā§āĻ¯ āĻā§āĻāĻā§āĻ¨:
āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋ - āĻā§āĻĒāĻ¤ā§āĻ¤āĻŋ - ((āĻāĻāĻŽāĻ¨ - āĻā§āĻĒāĻ¤ā§āĻ¤āĻŋ) - (āĻĒāĻ°āĻŋāĻŦāĻšāĻ¨ - āĻā§āĻ°āĻšāĻŖ)) / 2 =
2 * āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋ - 2 * āĻā§āĻĒāĻ¤ā§āĻ¤āĻŋ - āĻāĻāĻŽāĻ¨ + āĻā§āĻĒāĻ¤ā§āĻ¤āĻŋ + āĻĒā§āĻ°ā§āĻ°āĻŖ - āĻā§āĻ°āĻšāĻŖ =
āĻā§āĻ°āĻšāĻŖ - āĻā§āĻĒāĻ¤ā§āĻ¤āĻŋ - āĻāĻāĻŽāĻ¨ + āĻĒā§āĻ°ā§āĻ°āĻŖ
āĻāĻŽāĻ°āĻž āĻ¸ā§āĻĨāĻžāĻ¨ā§āĻ¯āĻŧ āĻ¸āĻŽāĻ¯āĻŧā§āĻ° āĻ¸āĻžāĻĨā§ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻŽāĻžāĻ¨ āĻ¯ā§āĻ āĻāĻ°āĻŋ āĻāĻŦāĻ āĻā§āĻŦāĻ¨ āĻāĻĒāĻā§āĻ āĻāĻ°āĻŋāĨ¤
āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻāĻāĻāĻĒā§āĻ
time_different = answer.get_time_different(arrive_time)
result = "Time difference: {}nServer time: {}n{}".format(
time_different,
datetime.datetime.fromtimestamp(time.time() + time_different).strftime("%c"),
answer.to_display())
print(result)
āĻĻāĻ°āĻāĻžāĻ°ā§
āĻāĻ¤ā§āĻ¸: www.habr.com