Unix时间戳转日期时间格式,C#、Java、Python各语言实现!
之前有个Q上好友没事问我,怎么自己写Unix时间戳转日期时间?于是我就顺手写了个C#版本给他!最近想起来,就萌发多写几个语言的版本分享,权当练习思路外加熟悉另外两种语言。
先说转换步骤
- 先处理年份,从1970年开始处理,根据平年闰年的总秒数,先得到年,剩余的秒数再求月份;
- 根据剩余秒数求得月份,因为2月的缘故,同样需要处理平年闰年‘;
- 得天数,直接除以每天的总秒数,然后取得天;
- 取小时、分钟、秒;
Python版本:
# -*- coding: UTF-8 -*-
from datetime import datetime, tzinfo, timedelta
import pytz class DateHelper:
def unixTimestmpToDate(self,timestamp):
#计算年
(remainSeconds,year) = self.__get_year(timestamp)
(remainSeconds,month) = self.__get_month(remainSeconds,year)
(remainSeconds,day) = self.__get_day(remainSeconds)
(remainSeconds,hour) = self.__get_hour(remainSeconds)
(remainSeconds,minute) = self.__get_minute(remainSeconds) result = datetime(year, month, day, hour, minute, remainSeconds, 0, UTC(8)) print result.strftime('%Y-%m-%d %H:%M:%S',) def __get_minute(self,timestamp):
"""
计算分钟
"""
min = timestamp / 60 return (timestamp - min * 60, min) def __get_hour(self,timestamp):
"""
计算小时
"""
hour = timestamp / (60 * 60) return (timestamp - hour * 60 * 60, hour) def __get_day(self,timestamp):
"""
计算天
"""
#每天的秒数
daySeconds = 24 * 60 * 60 day = timestamp / daySeconds return (timestamp - day * daySeconds, day + 1) def __get_month(self, timestamp, year):
"""
计算月份
"""
#每天的秒数
daySeconds = 24 * 60 * 60
#每月的总秒数
monthDays = [31 * daySeconds, 28 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds] if self.__is_leap_year(year):
monthDays[1] = 29 * daySeconds totalSeconds = 0
month = 0
for second in monthDays:
month +=1
if second + totalSeconds > timestamp:
break totalSeconds += second return (timestamp - totalSeconds, month) def __get_year(self,timestamp):
"""
计算年份
"""
year = 1969
totalSeconds = 0 while True:
year +=1
second = self.__get_year_seconds(year)
#年份总秒数大于时间戳
if totalSeconds + second > timestamp:
break totalSeconds += second return (timestamp - totalSeconds,year) def __get_year_seconds(self,year):
'''
得到每一年的总秒数
'''
isLeapYear = self.__is_leap_year(year) if isLeapYear:
return 366 * 24 * 60 * 60
else:
return 365 * 24 * 60 * 60 def __is_leap_year(self,year):
'''
判断是否闰年
'''
if year % 4 == 0 and year % 100 != 0:
return True
elif year % 400 == 0:
return True
else:
return False class UTC(tzinfo):
"""UTC 时区创建"""
def __init__(self,offset=0):
self._offset = offset def utcoffset(self, dt):
return timedelta(hours=self._offset) def tzname(self, dt):
return "UTC +%s" % self._offset def dst(self, dt):
return timedelta(hours=self._offset) if __name__ == "__main__":
datehelper = DateHelper()
datehelper.unixTimestmpToDate(1483200000)
C#版本:
class DateHelper
{
/// <summary>
/// unix时间戳转时间
/// </summary>
/// <param name="timestamp">时间戳</param>
/// <returns></returns>
public static DateTime UixTimestmpToDate(int timestamp)
{
int remainSeconds;
int year = GetYear(timestamp, out remainSeconds); int seconds = remainSeconds;
int month = GetMonth(seconds, year, out remainSeconds); // seconds = remainSeconds;
int day = GetDay(remainSeconds, out remainSeconds);
int hour = GetHours(remainSeconds, out remainSeconds);
int minute = GetMinute(remainSeconds, out remainSeconds); return new DateTime(year, month, day, hour, minute, remainSeconds);
} /// <summary>
/// 计算分钟
/// </summary>
/// <param name="timestamp"></param>
/// <param name="remainSeconds">剩余秒数</param>
/// <returns></returns>
private static int GetMinute(int timestamp, out int remainSeconds)
{
var minute = timestamp / ; remainSeconds = timestamp - minute * ; return minute;
} /// <summary>
/// 计算小时
/// </summary>
/// <param name="timestamp"></param>
/// <param name="remainSeconds"></param>
/// <returns></returns>
private static int GetHours(int timestamp, out int remainSeconds)
{
var hour = timestamp / ( * ); remainSeconds = timestamp - hour * * ; return hour;
} /// <summary>
/// 计算日
/// </summary>
/// <param name="timestamp"></param>
/// <param name="remainSeconds"></param>
/// <returns></returns>
private static int GetDay(int timestamp, out int remainSeconds)
{
var daySeconds = * * ; var day = timestamp / daySeconds; remainSeconds = timestamp - day * daySeconds; return day + ;
} /// <summary>
/// 计算月
/// </summary>
/// <param name="timestamp"></param>
/// <param name="year"></param>
/// <param name="remainSeconds"></param>
/// <returns></returns>
private static int GetMonth(int timestamp, int year, out int remainSeconds)
{
// 每天的秒数
var daySeconds = * * ;
//每月的总秒数
var monthDays = new int[] { * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds, * daySeconds }; if (IsLeepYear(year))
monthDays[] = * daySeconds; var totalSeconds = ;
var month = ;
foreach (var second in monthDays)
{
month += ;
if (second + totalSeconds > timestamp)
break; totalSeconds += second;
}
remainSeconds = timestamp - totalSeconds;
return month;
} /// <summary>
/// 计算年
/// </summary>
/// <param name="timestamp"></param>
/// <param name="remainSeconds"></param>
/// <returns></returns>
private static int GetYear(int timestamp, out int remainSeconds)
{
int year = , totalSeconds = ; while (true)
{
year += ;
int second = GetYearSeconds(year);
//年份总秒数大于时间戳
if (totalSeconds + second > timestamp)
break; totalSeconds += second; } remainSeconds = timestamp - totalSeconds; return year;
} /// <summary>
/// 得到每一年的总秒数
/// </summary>
/// <param name="year"></param>
/// <returns></returns>
private static int GetYearSeconds(int year)
{
if (IsLeepYear(year))
return * * * ;
else
return * * * ;
} /// <summary>
/// 判断闰年
/// </summary>
/// <param name="year"></param>
/// <returns></returns>
private static bool IsLeepYear(int year)
{ if (year % == && year % != )
return true;
else if (year % == )
return true;
else
return false;
}
/**
* Created by chong on 2017/7/4.
*/
public class DateHelper {
/**
* unix时间戳转时间
*
* @param timestamp 时间戳
* @return
* @throws ParseException
*/
public static Date uixTimestmpToDate(int timestamp) throws ParseException {
int[] year = GetYear(timestamp);
int[] month = GetMonth(year[1], year[0]);
int[] day = GetDay(month[1]);
int[] hour = GetHours(day[1]);
int[] minute = GetMinute(hour[1]); String strDate = String.format("%d-%d-%d %d:%d:%d", year[0], month[0], day[0], hour[0], minute[0], minute[1]); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//这次没有处理时区,所以直接输出的是UTC时间
Date strtodate = formatter.parse(strDate); return strtodate;
} /**
* 计算分钟
*
* @param timestamp
* @return
*/
private static int[] GetMinute(int timestamp) {
int minute = timestamp / 60; int remainSeconds = timestamp - minute * 60; return new int[]{minute, remainSeconds};
} /**
* 计算小时
*
* @param timestamp
* @return
*/
private static int[] GetHours(int timestamp) {
int hour = timestamp / (60 * 60); int remainSeconds = timestamp - hour * 60 * 60; return new int[]{hour, remainSeconds};
} /**
* 计算日
*
* @param timestamp
* @return
*/
private static int[] GetDay(int timestamp) {
int daySeconds = 24 * 60 * 60; int day = timestamp / daySeconds; int remainSeconds = timestamp - day * daySeconds; return new int[]{day + 1, remainSeconds};
} /**
* 计算月
*
* @param timestamp
* @param year
* @return
*/
private static int[] GetMonth(int timestamp, int year) {
// 每天的秒数
int daySeconds = 24 * 60 * 60;
//每月的总秒数
int[] monthDays = new int[]{31 * daySeconds, 28 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds, 30 * daySeconds, 31 * daySeconds}; if (IsLeepYear(year))
monthDays[1] = 29 * daySeconds; int totalSeconds = 0, month = 0;
for (int second : monthDays) {
month += 1;
if (second + totalSeconds > timestamp)
break; totalSeconds += second;
}
int remainSeconds = timestamp - totalSeconds;
return new int[]{month, remainSeconds};
} /**
* 计算年
*
* @param timestamp
* @return
*/
private static int[] GetYear(int timestamp) {
int year = 1969, totalSeconds = 0; while (true) {
year += 1;
int second = GetYearSeconds(year);
//年份总秒数大于时间戳
if (totalSeconds + second > timestamp)
break; totalSeconds += second; }
int remainSeconds = timestamp - totalSeconds; return new int[]{year, remainSeconds};
} /**
* 得到每一年的总秒数
*
* @param year
* @return
*/
private static int GetYearSeconds(int year) {
if (IsLeepYear(year))
return 366 * 24 * 60 * 60;
else
return 365 * 24 * 60 * 60;
} /**
* 判断闰年
*
* @param year
* @return
*/
private static boolean IsLeepYear(int year) { if (year % 4 == 0 && year % 100 != 0)
return true;
else if (year % 400 == 0)
return true;
else
return false;
} }
Unix时间戳转日期时间格式,C#、Java、Python各语言实现!的更多相关文章
- python转换时间戳和日期时间格式的转换
[steven@txzxp2 seccenter]$ python Python 2.7.5 (default, Jul 8 2013, 09:48:59) [GCC 4.8.1 20130603 ...
- python 日期、时间处理,各种日期时间格式/字符串之间的相互转换究竟是怎样的?
模块函数说明 ''' date 日期对象,常用的属性有year,month,day time 时间对象,常用的属性有hour,minute,second,毫秒 datetime 日期时间对象,常用的属 ...
- c# DateTime时间格式和JAVA时间戳格式相互转换
/// java时间戳格式时间戳转为C#格式时间 public static DateTime GetTime(long timeStamp) { DateTime dtStart = TimeZon ...
- [php基础]Mysql日期函数:日期时间格式转换函数详解
在PHP网站开发中,Mysql数据库设计中日期时间字段必不可少,由于Mysql日期函数输出的日期格式与PHP日期函数之间的日期格式兼容性不够,这就需要根据网站实际情况使用Mysql或PHP日期转换函数 ...
- UNIX时间戳与日期的相互转换
mysql中UNIX时间戳与日期的相互转换 UNIX时间戳转换为日期用函数:FROM_UNIXTIME() select FROM_UNIXTIME(1410318106); 日期转换为UNIX时间戳 ...
- db2 日期时间格式
db2日期和时间常用汇总 1.db2可以通过SYSIBM.SYSDUMMY1.SYSIBM.DUAL获取寄存器中的值,也可以通过VALUES关键字获取寄存器中的值. SELECT 'HELLO DB2 ...
- Android日期时间格式国际化
公共类 的DateFormatSymbols 扩展对象 实现 Serializable接口 Cloneable接口 java.lang.Object的 ↳ java.text.DateForma ...
- Eclipse 改动凝视的 date time 日期时间格式,即${date}变量格式
Eclipse 改动凝视的 date time 日期时间格式,即${date}变量格式 找到eclipse安装文件夹以下的plugins文件夹,搜索 org.eclipse.text ,找到一个jar ...
- js中时间戳与日期时间之间的相互转换
1.时间戳转换为标准日期时间格式: function timeFormat(dateStr) { var date = new Date(dateStr); Y = date.getFullYear( ...
随机推荐
- java中Class.getMethod方法
Method Class.getMethod(String name, Class<?>... parameterTypes)的作用是获得对象所声明的公开方法 该方法的第一个参数name是 ...
- [leetcode]2. Add Two Numbers.cpp
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
- BBS(第一天)项目之 注册功能实现通过forms验证与 前端ajax请求触发查询数据库判断用户是否存在的功能实现
1.BBS项目之注册功能通过forms验证 from django import forms from blog.models import User from django.contrib.auth ...
- windows from docker 安装部署spring jar包方法
1.安装docker for windows,去官网下载就可以了,按照官网安装 2.把jar和dockerfile放在一个目录下(target 目录下) Dockerfile: FROM java:8 ...
- html2canvas
最近公司有个需求,实现html 页面元素转为png图像,这边用了html2canvas来实现.,这里记录一下,避免以后忘了~~ 官网链接: http://html2canvas.hertzen.com ...
- cdnbest架设cdn同一个源用不同的端口访问如何设置
在站点里的应用防火墙-->高级设置里配置 比如test.com要同时用80和88访问
- window.innerWidth和document.body.clientWidth的区别
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java学习笔记(二十三):final关键字
final关键字有三种使用场景: final修饰类 final修饰方法 final修饰变量 final修饰的类,不能再有子类继承. 只要满足以下条件就可以把一个类设计为final类: 不是专门为继承而 ...
- 整合Spring框架和MyBatis框架
------------------------siwuxie095 整合 Spring 框架和 MyBatis 框架 ...
- SpriteKit 关于categoryBitMask collisionBitMask contactTestBitMask 遇到的一些问题
手写copy一下官方解释 首先是categoryBitMask /** 定义了这个物理刚体是属于哪个类别的掩码 .在一个场景中的每个物理刚体可以分配给达到 32 不同的类别(参数 int bitmas ...