1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
| #include <sys/time.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <time.h> #include <unistd.h> #include <getopt.h>
typedef struct { int set_time; time_t target_time; int show_time; int sync_time; char time_string[64]; int verbose; } time_tool_config_t;
void show_help(const char *program_name) { printf("用法: %s [选项]\n", program_name); printf("\n选项:\n"); printf(" -s, --set TIME 设置系统时间 (格式: YYYY-MM-DD HH:MM:SS)\n"); printf(" -g, --get 显示当前系统时间\n"); printf(" -S, --sync 同步时间\n"); printf(" -v, --verbose 详细输出\n"); printf(" -h, --help 显示此帮助信息\n"); printf("\n示例:\n"); printf(" %s -g # 显示当前时间\n", program_name); printf(" %s -s \"2023-12-25 10:30:00\" # 设置时间\n", program_name); printf(" %s -v -g # 详细显示当前时间\n", program_name); }
int parse_time_string(const char *time_str, time_t *result) { struct tm tm_time = {0}; char *endptr; if (strptime(time_str, "%Y-%m-%d %H:%M:%S", &tm_time) != NULL) { *result = mktime(&tm_time); if (*result == -1) { printf("时间转换失败\n"); return -1; } return 0; } *result = strtol(time_str, &endptr, 10); if (*endptr == '\0' && *result > 0) { return 0; } printf("无法解析时间字符串: %s\n", time_str); printf("支持的格式:\n"); printf(" YYYY-MM-DD HH:MM:SS\n"); printf(" Unix时间戳\n"); return -1; }
void show_detailed_time() { struct timeval tv; struct tm *tm_info; char time_str[128]; if (gettimeofday(&tv, NULL) == 0) { tm_info = localtime(&tv.tv_sec); strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", tm_info); printf("标准时间: %s.%06ld\n", time_str, tv.tv_usec); printf("Unix时间戳: %ld.%06ld\n", tv.tv_sec, tv.tv_usec); tm_info = gmtime(&tv.tv_sec); strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S UTC", tm_info); printf("UTC时间: %s\n", time_str); strftime(time_str, sizeof(time_str), "%A, %B %d, %Y", localtime(&tv.tv_sec)); printf("详细日期: %s\n", time_str); } else { printf("获取时间失败: %s\n", strerror(errno)); } }
int set_system_time(time_t target_time) { struct timeval tv; struct timezone tz = {0, 0}; int result; printf("设置系统时间为: %ld\n", target_time); tv.tv_sec = target_time; tv.tv_usec = 0; result = settimeofday(&tv, &tz); if (result == 0) { printf("✓ 系统时间设置成功\n"); show_current_time(); return 0; } else { printf("✗ 系统时间设置失败: %s\n", strerror(errno)); if (errno == EPERM) { printf(" 需要root权限来设置系统时间\n"); } return -1; } }
int demo_time_management_tool() { time_tool_config_t config = {0}; uid_t uid = getuid(); printf("=== 时间管理工具演示 ===\n"); printf("工具功能:\n"); printf(" 1. 显示系统时间\n"); printf(" 2. 设置系统时间\n"); printf(" 3. 时间同步\n"); printf(" 4. 详细时间信息\n"); printf("\n权限检查:\n"); printf(" 当前用户ID: %d\n", uid); if (uid == 0) { printf(" ✓ 具有root权限,可以设置系统时间\n"); } else { printf(" ✗ 没有root权限,时间设置功能将受限\n"); } printf("\n1. 显示当前时间:\n"); show_current_time(); printf("\n2. 详细时间信息:\n"); show_detailed_time(); printf("\n3. 时间设置功能演示:\n"); struct timeval current_time; if (gettimeofday(¤t_time, NULL) == 0) { time_t future_time = current_time.tv_sec + 60; printf(" 尝试设置时间为1分钟后: %ld\n", future_time); if (uid == 0) { if (set_system_time(future_time) == 0) { printf(" ✓ 时间设置成功\n"); printf(" 恢复原始时间: %ld\n", current_time.tv_sec); set_system_time(current_time.tv_sec); } } else { struct timeval future_tv; future_tv.tv_sec = future_time; future_tv.tv_usec = current_time.tv_usec; int result = settimeofday(&future_tv, NULL); if (result != 0) { printf(" ✗ 时间设置失败 (预期): %s\n", strerror(errno)); printf(" 需要root权限才能设置系统时间\n"); } } } printf("\n4. 时间格式解析演示:\n"); const char *time_formats[] = { "2023-12-25 10:30:00", "1703498200", NULL }; for (int i = 0; time_formats[i]; i++) { time_t parsed_time; printf(" 解析时间字符串: %s\n", time_formats[i]); if (parse_time_string(time_formats[i], &parsed_time) == 0) { printf(" ✓ 解析成功: %ld\n", parsed_time); } else { printf(" ✗ 解析失败\n"); } } printf("\n=== 工具使用建议 ===\n"); printf("1. 时间设置需要root权限\n"); printf("2. 建议使用NTP服务进行时间同步\n"); printf("3. 避免频繁手动调整系统时间\n"); printf("4. 记录时间变更操作日志\n"); printf("5. 使用逐步调整避免时间跳跃\n"); return 0; }
void show_current_time();
int main() { return demo_time_management_tool(); }
|