您的位置:首页 > 编程语言 > Python开发

Unix时间戳转日期时间格式,C#、Java、Python各语言实现!

2017-07-04 12:12 585 查看
之前有个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 / 60;

remainSeconds = timestamp - minute * 60;

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 / (60 * 60);

remainSeconds = timestamp - hour * 60 * 60;

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 = 24 * 60 * 60;

var day = timestamp / daySeconds;

remainSeconds = timestamp - day * daySeconds;

return day + 1;
}

/// <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 = 24 * 60 * 60;
//每月的总秒数
var 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;

var totalSeconds = 0;
var month = 0;
foreach (var second in monthDays)
{
month += 1;
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 = 1969, totalSeconds = 0;

while (true)
{
year += 1;
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 366 * 24 * 60 * 60;
else
return 365 * 24 * 60 * 60;
}

/// <summary>
/// 判断闰年
/// </summary>
/// <param name="year"></param>
/// <returns></returns>
private static bool IsLeepYear(int year)
{

if (year % 4 == 0 && year % 100 != 0)
return true;
else if (year % 400 == 0)
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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐