python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python时间戳转换

使用Python自制GUI版时间戳转换器

作者:小庄-Python办公

在日常开发工作中,我们经常需要处理时间戳的转换问题,本文将和大家分享一个使用Python和Tkinter开发的时间戳转换器GUI应用,有需要的可以了解下

前言

在日常开发工作中,我们经常需要处理时间戳的转换问题。无论是调试API接口、分析日志文件,还是进行数据处理,时间戳的格式转换都是一个常见需求。今天我将分享一个使用Python和Tkinter开发的时间戳转换器GUI应用,它能够帮助开发者快速完成各种时间戳格式之间的转换。

项目概述

这个时间戳转换器具有以下核心功能:

技术架构

核心依赖

import time
import datetime
import tkinter as tk
from tkinter import ttk, messagebox
from typing import Union

项目采用了Python标准库,无需安装额外的第三方依赖,具有良好的兼容性和可移植性。

架构设计

应用采用了经典的MVC(Model-View-Controller)设计模式:

核心功能实现

1. 时间戳转换核心类

class TimestampConverter:
    """时间戳转换器类"""
    
    def current_timestamp(self, precision: str = 'seconds') -> Union[int, float]:
        """获取当前时间戳"""
        if precision == 'milliseconds':
            return int(time.time() * 1000)
        return int(time.time())
    
    def timestamp_to_string(self, timestamp: Union[int, float], 
                          format_str: str = '%Y-%m-%d %H:%M:%S',
                          precision: str = 'seconds') -> str:
        """时间戳转换为格式化字符串"""
        dt = self.timestamp_to_datetime(timestamp, precision)
        return dt.strftime(format_str)
    
    def string_to_timestamp(self, time_str: str, 
                          format_str: str = '%Y-%m-%d %H:%M:%S',
                          precision: str = 'seconds') -> Union[int, float]:
        """时间字符串转换为时间戳"""
        dt = datetime.datetime.strptime(time_str, format_str)
        timestamp = dt.timestamp()
        
        if precision == 'milliseconds':
            return int(timestamp * 1000)
        return int(timestamp)

设计亮点:

2. 用户界面设计

界面采用Tkinter的ttk模块,提供现代化的控件外观:

def setup_ui(self):
    """设置用户界面"""
    self.root.title("时间戳转换器")
    self.root.geometry("600x600")
    self.root.resizable(True, True)
    
    # 创建主框架
    main_frame = ttk.Frame(self.root, padding="10")
    main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))

界面特色:

3. 功能区域详解

当前时间戳获取区域

# 当前时间戳区域
current_frame = ttk.LabelFrame(main_frame, text="当前时间戳", padding="10")
ttk.Button(current_frame, text="获取当前时间戳(秒)", 
          command=self.get_current_timestamp_seconds)
ttk.Button(current_frame, text="获取当前时间戳(毫秒)", 
          command=self.get_current_timestamp_milliseconds)

这个区域允许用户快速获取当前时间的时间戳,支持秒级和毫秒级两种精度。

时间戳转字符串区域

提供时间戳输入框、精度选择下拉框、格式输入框和转换按钮,用户可以将数字时间戳转换为可读的时间字符串。

字符串转时间戳区域

与上一个区域功能相反,允许用户输入时间字符串和对应的格式,转换为时间戳。

4. 错误处理机制

def convert_timestamp_to_string(self):
    """时间戳转字符串"""
    try:
        timestamp_str = self.timestamp_input.get().strip()
        if not timestamp_str:
            messagebox.showerror("错误", "请输入时间戳")
            return
            
        timestamp = float(timestamp_str)
        precision = self.ts_precision.get()
        format_str = self.format_input.get()
        
        result = self.converter.timestamp_to_string(timestamp, format_str, precision)
        self.ts_result.set(result)
        
    except ValueError as e:
        messagebox.showerror("错误", f"时间戳格式错误: {str(e)}")
    except Exception as e:
        messagebox.showerror("错误", f"转换失败: {str(e)}")

错误处理特点:

实用功能特性

1. 一键复制功能

def copy_to_clipboard(self, text):
    """复制文本到剪贴板"""
    if text:
        self.root.clipboard_clear()
        self.root.clipboard_append(text)
        messagebox.showinfo("成功", "已复制到剪贴板")
    else:
        messagebox.showwarning("警告", "没有内容可复制")

每个转换结果都配备了复制按钮,方便用户快速复制结果到其他应用中使用。

2. 常用格式提示

应用内置了常用的时间格式示例:

3. 精度支持

应用支持秒级和毫秒级两种时间戳精度,满足不同场景的需求:

使用场景

这个时间戳转换器在以下场景中特别有用:

运行方式

python timestamp_converter_gui.py

程序启动后会显示一个600x600像素的窗口,包含所有转换功能。界面支持窗口大小调整,适应不同的屏幕尺寸。

技术总结

优点

可扩展性

代码采用面向对象设计,具有良好的可扩展性:

完整代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
时间戳转换器 - GUI版本
支持多种时间戳格式的相互转换,提供图形界面
"""

import time
import datetime
import tkinter as tk
from tkinter import ttk, messagebox
from typing import Union

class TimestampConverter:
    """时间戳转换器类"""
    
    def __init__(self):
        """初始化转换器"""
        pass
    
    def current_timestamp(self, precision: str = 'seconds') -> Union[int, float]:
        """
        获取当前时间戳
        
        Args:
            precision: 精度,'seconds'(秒) 或 'milliseconds'(毫秒)
            
        Returns:
            当前时间戳
        """
        if precision == 'milliseconds':
            return int(time.time() * 1000)
        return int(time.time())
    
    def timestamp_to_datetime(self, timestamp: Union[int, float], 
                            precision: str = 'seconds') -> datetime.datetime:
        """
        时间戳转换为datetime对象
        
        Args:
            timestamp: 时间戳
            precision: 精度,'seconds'(秒) 或 'milliseconds'(毫秒)
            
        Returns:
            datetime对象
        """
        if precision == 'milliseconds':
            timestamp = timestamp / 1000
        return datetime.datetime.fromtimestamp(timestamp)
    
    def timestamp_to_string(self, timestamp: Union[int, float], 
                          format_str: str = '%Y-%m-%d %H:%M:%S',
                          precision: str = 'seconds') -> str:
        """
        时间戳转换为格式化字符串
        
        Args:
            timestamp: 时间戳
            format_str: 格式化字符串
            precision: 精度,'seconds'(秒) 或 'milliseconds'(毫秒)
            
        Returns:
            格式化的时间字符串
        """
        dt = self.timestamp_to_datetime(timestamp, precision)
        return dt.strftime(format_str)
    
    def string_to_timestamp(self, time_str: str, 
                          format_str: str = '%Y-%m-%d %H:%M:%S',
                          precision: str = 'seconds') -> Union[int, float]:
        """
        时间字符串转换为时间戳
        
        Args:
            time_str: 时间字符串
            format_str: 格式化字符串
            precision: 精度,'seconds'(秒) 或 'milliseconds'(毫秒)
            
        Returns:
            时间戳
        """
        dt = datetime.datetime.strptime(time_str, format_str)
        timestamp = dt.timestamp()
        
        if precision == 'milliseconds':
            return int(timestamp * 1000)
        return int(timestamp)
    
    def convert_precision(self, timestamp: Union[int, float], 
                        from_precision: str, to_precision: str) -> Union[int, float]:
        """
        转换时间戳精度
        
        Args:
            timestamp: 原时间戳
            from_precision: 原精度,'seconds' 或 'milliseconds'
            to_precision: 目标精度,'seconds' 或 'milliseconds'
            
        Returns:
            转换后的时间戳
        """
        if from_precision == to_precision:
            return timestamp
        
        if from_precision == 'seconds' and to_precision == 'milliseconds':
            return int(timestamp * 1000)
        elif from_precision == 'milliseconds' and to_precision == 'seconds':
            return int(timestamp / 1000)
        else:
            raise ValueError("不支持的精度转换")

class TimestampConverterGUI:
    """时间戳转换器图形界面"""
    
    def __init__(self, root):
        self.root = root
        self.converter = TimestampConverter()
        self.setup_ui()
        
    def setup_ui(self):
        """设置用户界面"""
        self.root.title("时间戳转换器")
        self.root.geometry("600x600")
        self.root.resizable(True, True)
        
        # 创建主框架
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
        
        # 配置网格权重
        self.root.columnconfigure(0, weight=1)
        self.root.rowconfigure(0, weight=1)
        main_frame.columnconfigure(1, weight=1)
        
        # 标题
        title_label = ttk.Label(main_frame, text="时间戳转换器(作者:小庄-Python办公)", font=('Arial', 16, 'bold'))
        title_label.grid(row=0, column=0, columnspan=3, pady=(0, 20))
        
        # 当前时间戳区域
        current_frame = ttk.LabelFrame(main_frame, text="当前时间戳", padding="10")
        current_frame.grid(row=1, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=(0, 10))
        current_frame.columnconfigure(1, weight=1)
        
        ttk.Button(current_frame, text="获取当前时间戳(秒)", 
                  command=self.get_current_timestamp_seconds).grid(row=0, column=0, padx=(0, 10))
        self.current_ts_seconds = tk.StringVar()
        ttk.Entry(current_frame, textvariable=self.current_ts_seconds, 
                 state="readonly").grid(row=0, column=1, sticky=(tk.W, tk.E), padx=(0, 10))
        ttk.Button(current_frame, text="复制", 
                  command=lambda: self.copy_to_clipboard(self.current_ts_seconds.get())).grid(row=0, column=2)
        
        ttk.Button(current_frame, text="获取当前时间戳(毫秒)", 
                  command=self.get_current_timestamp_milliseconds).grid(row=1, column=0, padx=(0, 10), pady=(5, 0))
        self.current_ts_milliseconds = tk.StringVar()
        ttk.Entry(current_frame, textvariable=self.current_ts_milliseconds, 
                 state="readonly").grid(row=1, column=1, sticky=(tk.W, tk.E), padx=(0, 10), pady=(5, 0))
        ttk.Button(current_frame, text="复制", 
                  command=lambda: self.copy_to_clipboard(self.current_ts_milliseconds.get())).grid(row=1, column=2, pady=(5, 0))
        
        # 时间戳转字符串区域
        ts_to_str_frame = ttk.LabelFrame(main_frame, text="时间戳 → 字符串", padding="10")
        ts_to_str_frame.grid(row=2, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=(0, 10))
        ts_to_str_frame.columnconfigure(1, weight=1)
        
        ttk.Label(ts_to_str_frame, text="时间戳:").grid(row=0, column=0, sticky=tk.W)
        self.timestamp_input = tk.StringVar()
        ttk.Entry(ts_to_str_frame, textvariable=self.timestamp_input).grid(row=0, column=1, sticky=(tk.W, tk.E), padx=(10, 10))
        
        ttk.Label(ts_to_str_frame, text="精度:").grid(row=0, column=2, sticky=tk.W)
        self.ts_precision = tk.StringVar(value="seconds")
        precision_combo = ttk.Combobox(ts_to_str_frame, textvariable=self.ts_precision, 
                                     values=["seconds", "milliseconds"], state="readonly", width=12)
        precision_combo.grid(row=0, column=3, padx=(10, 0))
        
        ttk.Label(ts_to_str_frame, text="格式:").grid(row=1, column=0, sticky=tk.W, pady=(10, 0))
        self.format_input = tk.StringVar(value="%Y-%m-%d %H:%M:%S")
        ttk.Entry(ts_to_str_frame, textvariable=self.format_input).grid(row=1, column=1, sticky=(tk.W, tk.E), padx=(10, 10), pady=(10, 0))
        
        ttk.Button(ts_to_str_frame, text="转换", 
                  command=self.convert_timestamp_to_string).grid(row=1, column=2, columnspan=2, padx=(10, 0), pady=(10, 0))
        
        ttk.Label(ts_to_str_frame, text="结果:").grid(row=2, column=0, sticky=tk.W, pady=(10, 0))
        self.ts_result = tk.StringVar()
        result_entry = ttk.Entry(ts_to_str_frame, textvariable=self.ts_result, state="readonly")
        result_entry.grid(row=2, column=1, sticky=(tk.W, tk.E), padx=(10, 10), pady=(10, 0))
        ttk.Button(ts_to_str_frame, text="复制", 
                  command=lambda: self.copy_to_clipboard(self.ts_result.get())).grid(row=2, column=2, columnspan=2, padx=(10, 0), pady=(10, 0))
        
        # 字符串转时间戳区域
        str_to_ts_frame = ttk.LabelFrame(main_frame, text="字符串 → 时间戳", padding="10")
        str_to_ts_frame.grid(row=3, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=(0, 10))
        str_to_ts_frame.columnconfigure(1, weight=1)
        
        ttk.Label(str_to_ts_frame, text="时间字符串:").grid(row=0, column=0, sticky=tk.W)
        self.time_string_input = tk.StringVar()
        ttk.Entry(str_to_ts_frame, textvariable=self.time_string_input).grid(row=0, column=1, sticky=(tk.W, tk.E), padx=(10, 10))
        
        ttk.Label(str_to_ts_frame, text="输出精度:").grid(row=0, column=2, sticky=tk.W)
        self.output_precision = tk.StringVar(value="seconds")
        output_precision_combo = ttk.Combobox(str_to_ts_frame, textvariable=self.output_precision, 
                                            values=["seconds", "milliseconds"], state="readonly", width=12)
        output_precision_combo.grid(row=0, column=3, padx=(10, 0))
        
        ttk.Label(str_to_ts_frame, text="输入格式:").grid(row=1, column=0, sticky=tk.W, pady=(10, 0))
        self.input_format = tk.StringVar(value="%Y-%m-%d %H:%M:%S")
        ttk.Entry(str_to_ts_frame, textvariable=self.input_format).grid(row=1, column=1, sticky=(tk.W, tk.E), padx=(10, 10), pady=(10, 0))
        
        ttk.Button(str_to_ts_frame, text="转换", 
                  command=self.convert_string_to_timestamp).grid(row=1, column=2, columnspan=2, padx=(10, 0), pady=(10, 0))
        
        ttk.Label(str_to_ts_frame, text="结果:").grid(row=2, column=0, sticky=tk.W, pady=(10, 0))
        self.str_result = tk.StringVar()
        str_result_entry = ttk.Entry(str_to_ts_frame, textvariable=self.str_result, state="readonly")
        str_result_entry.grid(row=2, column=1, sticky=(tk.W, tk.E), padx=(10, 10), pady=(10, 0))
        ttk.Button(str_to_ts_frame, text="复制", 
                  command=lambda: self.copy_to_clipboard(self.str_result.get())).grid(row=2, column=2, columnspan=2, padx=(10, 0), pady=(10, 0))
        
        # 常用格式提示
        tips_frame = ttk.LabelFrame(main_frame, text="常用格式提示", padding="10")
        tips_frame.grid(row=4, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=(0, 10))
        
        tips_text = (
            "%Y-%m-%d %H:%M:%S    →    2024-01-01 12:00:00\n"
            "%Y年%m月%d日 %H时%M分%S秒    →    2024年01月01日 12时00分00秒\n"
            "%Y/%m/%d %H:%M:%S    →    2024/01/01 12:00:00\n"
            "%Y-%m-%dT%H:%M:%S    →    2024-01-01T12:00:00 (ISO格式)"
        )
        ttk.Label(tips_frame, text=tips_text, font=('Consolas', 9)).grid(row=0, column=0, sticky=tk.W)
        
    def get_current_timestamp_seconds(self):
        """获取当前秒级时间戳"""
        timestamp = self.converter.current_timestamp('seconds')
        self.current_ts_seconds.set(str(timestamp))
        
    def get_current_timestamp_milliseconds(self):
        """获取当前毫秒级时间戳"""
        timestamp = self.converter.current_timestamp('milliseconds')
        self.current_ts_milliseconds.set(str(timestamp))
        
    def convert_timestamp_to_string(self):
        """时间戳转字符串"""
        try:
            timestamp_str = self.timestamp_input.get().strip()
            if not timestamp_str:
                messagebox.showerror("错误", "请输入时间戳")
                return
                
            timestamp = float(timestamp_str)
            precision = self.ts_precision.get()
            format_str = self.format_input.get()
            
            result = self.converter.timestamp_to_string(timestamp, format_str, precision)
            self.ts_result.set(result)
            
        except ValueError as e:
            messagebox.showerror("错误", f"时间戳格式错误: {str(e)}")
        except Exception as e:
            messagebox.showerror("错误", f"转换失败: {str(e)}")
            
    def convert_string_to_timestamp(self):
        """字符串转时间戳"""
        try:
            time_str = self.time_string_input.get().strip()
            if not time_str:
                messagebox.showerror("错误", "请输入时间字符串")
                return
                
            format_str = self.input_format.get()
            precision = self.output_precision.get()
            
            result = self.converter.string_to_timestamp(time_str, format_str, precision)
            self.str_result.set(str(result))
            
        except ValueError as e:
            messagebox.showerror("错误", f"时间格式错误: {str(e)}")
        except Exception as e:
            messagebox.showerror("错误", f"转换失败: {str(e)}")
            
    def copy_to_clipboard(self, text):
        """复制文本到剪贴板"""
        if text:
            self.root.clipboard_clear()
            self.root.clipboard_append(text)
            messagebox.showinfo("成功", "已复制到剪贴板")
        else:
            messagebox.showwarning("警告", "没有内容可复制")

def main():
    """主函数"""
    root = tk.Tk()
    app = TimestampConverterGUI(root)
    root.mainloop()

if __name__ == "__main__":
    main()

效果图

结尾

这个时间戳转换器虽然功能相对简单,但展示了如何使用Python和Tkinter构建实用的桌面应用程序。它不仅解决了开发者日常工作中的实际问题,也是学习GUI编程和时间处理的良好示例。

通过这个项目,我们可以学到:

到此这篇关于使用Python自制GUI版时间戳转换器的文章就介绍到这了,更多相关Python时间戳转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文