⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lb_date.cpp

📁 在手机操作系统symbina上使用的一个脚本扩展语言的代码实现,可以参考用于自己的开发
💻 CPP
字号:
// LB_DATE.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//



#include <opcodes.h>
#include "oplutil.h"

void FuncOpCode::Day(CStack& aStack, COplRuntime& , CFrame* )
	{
	TTime now;
	now.HomeTime();
	TDateTime dateTime = now.DateTime();
	aStack.Push(TInt16(dateTime.Day()+1));
	}


void FuncOpCode::Hour(CStack& aStack, COplRuntime& , CFrame* )
	{
	TTime now;
	now.HomeTime();
	TDateTime dateTime = now.DateTime();
	aStack.Push(TInt16(dateTime.Hour()));
	}
void FuncOpCode::Minute(CStack& aStack, COplRuntime& , CFrame* )
	{
	TTime now;
	now.HomeTime();
	TDateTime dateTime = now.DateTime();
	aStack.Push(TInt16(dateTime.Minute()));
	}

void FuncOpCode::Month(CStack& aStack, COplRuntime& , CFrame* )
	{
	TTime now;
	now.HomeTime();
	TDateTime dateTime = now.DateTime();
	aStack.Push(TInt16(dateTime.Month()+1));
	}
void FuncOpCode::Second(CStack& aStack, COplRuntime& , CFrame* )
	{
	TTime now;
	now.HomeTime();
	TDateTime dateTime = now.DateTime();
	aStack.Push(TInt16(dateTime.Second()));
	}
void FuncOpCode::Year(CStack& aStack, COplRuntime& , CFrame* )
	{
	TTime now;
	now.HomeTime();
	TDateTime dateTime = now.DateTime();
	aStack.Push(TInt16(dateTime.Year()));
	}

LOCAL_C TDateTime LocalDateTime(TInt aYear,TMonth aMonth,TInt aDay,TInt aHour,TInt aMinute,TInt aSecond,TInt aMicroSecond)
    {
    TDateTime dateTime;
    if (dateTime.Set(aYear,aMonth,aDay,aHour,aMinute,aSecond,aMicroSecond))
        User::Leave(KOplErrInvalidArgs);
    return dateTime;
    }
void FuncOpCode::Dow(CStack& aStack, COplRuntime& , CFrame* )
	{
	TInt16 year=aStack.PopInt16();
	TInt16 month=aStack.PopInt16();
	TInt16 day=aStack.PopInt16();
	TDateTime dateTime=LocalDateTime(year,TMonth(month-1),day-1,0,0,0,0);
	TTime aTime(dateTime);
	aStack.Push(TInt16(aTime.DayNoInWeek()+1));
	}

void FuncOpCode::Week(CStack& aStack, COplRuntime& , CFrame* )
	{
	TInt16 year=aStack.PopInt16();
	TInt16 month=aStack.PopInt16();
	TInt16 day=aStack.PopInt16();
	TDateTime dateTime=LocalDateTime(year,TMonth(month-1),day-1,0,0,0,0);
	TTime aTime(dateTime);
	aStack.Push(TInt16(aTime.WeekNoInYear(EFirstFourDayWeek)));
	}

void FuncOpCode::Days(CStack& aStack, COplRuntime& , CFrame* )
	{            // dateTodays
	TInt16 year=aStack.PopInt16();
	TInt16 month=aStack.PopInt16();
	TInt16 day=aStack.PopInt16();
	
	TDateTime dateTime=LocalDateTime(year,TMonth(month-1),day-1,0,0,0,0);
	TTime aTime(dateTime);								  // input date
 	TDateTime offSetDate(1900,TMonth(0),0,0,0,0,0);		 
	TTime offSet(offSetDate);                               // 1/1/1900
	TTimeIntervalDays  days=aTime.DaysFrom(offSet);
	aStack.Push(TInt32(days.Int()));
	}

void OpCode::DaysToDate(CStack& aStack, COplRuntime& aRuntime, CFrame* )
    {
    RHeap& heap=aRuntime.Heap64();
	TInt16* dy=(TInt16*)OplUtil::PopOffsetAsAddrL(aStack,heap,sizeof(TUint16));
	TInt16* mo=(TInt16*)OplUtil::PopOffsetAsAddrL(aStack,heap,sizeof(TUint16));
	TInt16* yr=(TInt16*)OplUtil::PopOffsetAsAddrL(aStack,heap,sizeof(TUint16));
	TInt  days=aStack.PopInt32();	                     	// days from 1/1/1900

	TDateTime offSetDate(1900,TMonth(0),0,0,0,0,0);
	TTime offSet(offSetDate);                               // micros to 1900
	TInt64 totalMicroSecs=(offSet.Int64())+ (TInt64(days)*86400*1000000);
	TTime  retTime(totalMicroSecs);
	TDateTime retDate=retTime.DateTime();

	OplUtil::PutWord(dy,TInt16(retDate.Day()+1));
	OplUtil::PutWord(mo,TInt16(retDate.Month()+1));
	OplUtil::PutWord(yr,TInt16(retDate.Year()));
    }

void FuncOpCode::DateToSecs(CStack& aStack, COplRuntime& , CFrame* )
	{
	TInt16 seconds=aStack.PopInt16();
	TInt16 minutes=aStack.PopInt16();
	TInt16 hours=aStack.PopInt16();
   	TInt16 day=aStack.PopInt16();
	TInt16 month=aStack.PopInt16();
	TInt16 year=aStack.PopInt16();
    TDateTime dateTime=LocalDateTime(year,TMonth(month-1),day-1,hours,minutes,seconds,0);
	TDateTime startDate(1970,TMonth(0),0,0,0,0,0);
	TTime aTime(dateTime);
	TTime sTime(startDate);
    if (aTime<sTime)
        User::Leave(KOplErrInvalidArgs);
	TTimeIntervalMicroSeconds microsFrom=aTime.MicroSecondsFrom(sTime);
	TInt64 int64=(microsFrom.Int64())/1000000;
	if (int64>KMaxTUint32)
		User::Leave(KOplErrInvalidArgs);
	aStack.Push(TInt32(int64.Low()));
	}

void OpCode::SecsToDate(CStack& aStack, COplRuntime& aRuntime, CFrame* )
	{
    RHeap& heap=aRuntime.Heap64();
	TInt16* yrDay=(TInt16*)OplUtil::PopOffsetAsAddrL(aStack,heap,sizeof(TUint16));
	TInt16* sc=(TInt16*)OplUtil::PopOffsetAsAddrL(aStack,heap,sizeof(TUint16));
	TInt16* mn=(TInt16*)OplUtil::PopOffsetAsAddrL(aStack,heap,sizeof(TUint16));
  	TInt16* hr=(TInt16*)OplUtil::PopOffsetAsAddrL(aStack,heap,sizeof(TUint16));
	TInt16* dy=(TInt16*)OplUtil::PopOffsetAsAddrL(aStack,heap,sizeof(TUint16));
	TInt16* mo=(TInt16*)OplUtil::PopOffsetAsAddrL(aStack,heap,sizeof(TUint16));
	TInt16* yr=(TInt16*)OplUtil::PopOffsetAsAddrL(aStack,heap,sizeof(TUint16));
	TUint secs=aStack.PopInt32();	                     	// secs from 1/1/1970

	TDateTime offSetDate(1970,TMonth(0),0,0,0,0,0);
	TTime offSet(offSetDate);								// microsecs since 0000-1970
	TInt64 totalMicroSecs=(TInt64(secs)*1000000)+(offSet.Int64()); // micros since 0000
	TTime  retTime(totalMicroSecs);
	TDateTime retDate=retTime.DateTime();			   // required date

	OplUtil::PutWord(yrDay,TInt16(retTime.DayNoInYear()));
	OplUtil::PutWord(sc,TInt16(retDate.Second()));
	OplUtil::PutWord(mn,TInt16(retDate.Minute()));
	OplUtil::PutWord(hr,TInt16(retDate.Hour()));
	OplUtil::PutWord(dy,TInt16(retDate.Day()+1));
	OplUtil::PutWord(mo,TInt16(retDate.Month()+1));
	OplUtil::PutWord(yr,TInt16(retDate.Year()));
	}


void FuncOpCode::DatimStr(CStack& aStack, COplRuntime& , CFrame* )
	{// system time ->  Fri 16 oct 1992 16:25:30
	TTime now;
	now.HomeTime();
	TBuf<256> datim;
	_LIT(KDatim,"%F%*E %D %*N %Y %H:%T:%S");
	now.FormatL(datim,KDatim);
	aStack.Push(datim);
	}
   

void FuncOpCode::DayNameStr(CStack& aStack, COplRuntime& , CFrame* )
	{// 1-7 -> mon-sun
    TInt day=(aStack.PopInt16()-1);
    if(day<0 || day>6)
        User::Leave(KOplErrInvalidArgs);	
    aStack.Push(TDayNameAbb(TDay(day)));
	}

void FuncOpCode::MonthStr(CStack& aStack, COplRuntime& , CFrame* )
	{// 1-12 -> jan - dec
    TInt month=(aStack.PopInt16()-1);
    if(month<0 || month>11)
        User::Leave(KOplErrInvalidArgs);
    aStack.Push(TMonthNameAbb(TMonth(month)));	
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -